所以我试着这样做:
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视为数字不起作用时,而是当它起作用时,因为在这些情况下,类型提示改变了代码的语义,而它们不应该这样做。