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

时间:2015-05-16 02:12:22

标签: clojure clojure-java-interop

所以我在尝试这个:

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=> 

糟糕! WTF还在继续?

在介绍黑客之后我就有了工作:

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或明确投射的情况下这只能工作?

1 个答案:

答案 0 :(得分:1)

类型提示并不意味着改变程序的语义。在Clojure中将字符转换为数字的假设方法是int函数。

示例:

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

所以要明确一点,在Clojure中,char应该始终被自动装入Character s,而不是数字。因此,代码中的奇怪部分不是在处理char时因为数字不起作用,而是在它起作用时,因为在这些情况下类型提示会改变代码的语义,而这些语义不应该。