将 Java 本机函数映射到 char 数组导致异常
Mapping a Java native function to an array of char results in exception
所以我在尝试这个:
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正在进行中?
我在引入 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 视为数字不起作用时,而是当它起作用时,因为在那些情况下,类型提示会改变代码的语义,而这是它们不应该改变的。
所以我在尝试这个:
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正在进行中?
我在引入 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 视为数字不起作用时,而是当它起作用时,因为在那些情况下,类型提示会改变代码的语义,而这是它们不应该改变的。