将Java本机函数映射到char数组将导致异常



所以我试着这样做:

user=> (Integer/toBinaryString ^int (.charValue c))
"1100011"
user=> 

我想…嗯,看起来很有希望,现在让我们试试这个:

user=> (map #(Integer/toBinaryString ^int (.charValue %)) "some")
ClassCastException java.lang.Character cannot be cast to java.lang.Number  user/eval1209/fn--1210 (form-init3852254868488042860.clj:1)
user=> ; Tried this as well. But without luck:
user=> (map #(Integer/toBinaryString ^int (.charValue %)) (.toCharArray "some"))
ClassCastException java.lang.Character cannot be cast to java.lang.Number  user/eval1249/fn--1250 (form-init3852254868488042860.clj:1)
user=> 

哦!到底是怎么回事?

在引入一个hack后,我让它工作了:

user=> (map #(Integer/toBinaryString ^int (.charValue (Character/valueOf %))) "some")
("1110011" "1101111" "1101101" "1100101")
user=> ; Or alternatively:
user=> (map (fn [^Character c] (Integer/toBinaryString ^int (.charValue c))) "some")
("1110011" "1101111" "1101101" "1100101")
user=> ; Or:
user=> (map #(Integer/toBinaryString ^int (.charValue ^Character %)) "some")
("1110011" "1101111" "1101101" "1100101")
user=> 

那么,有人知道为什么不调用Character/valueOf或显式强制转换就不能工作吗?

类型提示不是用来改变程序的语义的。在Clojure中将字符转换为数字的方法是int函数。

的例子:

user=> (map #(-> % int Integer/toBinaryString) "some")
("1110011" "1101111" "1101101" "1100101")

所以要清楚,在Clojure中,char s应该总是自动装箱到Character s,这不是数字。因此,代码中奇怪的部分不是当将char s视为数字不起作用时,而是当它起作用时,因为在这些情况下,类型提示改变了代码的语义,而它们不应该这样做。

相关内容

  • 没有找到相关文章

最新更新