给出以下代码:
(map Integer/parseInt ["1" "2" "3" "4"])
为什么除非我换行,否则会出现以下异常Integer/parseInt
在匿名函数中并手动调用它(#(Integer/parseInt %)
)?
clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to find static field: parseInt in class java.lang.Integer
java interop 的文档说明如下:
访问字段或方法成员的首选惯用形式
上面给出了。实例成员表单适用于两个字段和
方法。对于字段来说,instanceField 形式是首选,并且是必需的
如果同名的字段和 0 参数方法都存在。他们
全部扩展为对点运算符的调用(如下所述)
宏观膨胀时间。扩展如下:
...
(类名/静态方法
args*) ==> (.类名 staticMethod args*) 类名/staticField ==>
(.类名staticField)
所以你应该记住Class/fieldName
只是一个获得静电的糖field,既不是静态的方法调用, nor 静态方法的引用(java方法实际上并不是clojure函数),所以没有静态字段parseInt
in Integer class
, while (Class/fieldName arg)
调用静态method,它们是两个完全不同的操作,使用相似的糖语法。
所以当你这样做时(map #(Integer/parseInt %) ["1" "2" "3" "4"])
它扩展到
(map #(. Integer parseInt %) ["1" "2" "3" "4"])
(你可以通过宏展开轻松地自己看到它),
and (map Integer/parseInt ["1" "2" "3"])
扩展到
(map (. Integer parseInt) ["1" "2" "3"])
当它尝试获取一个字段(您认为它正在获取对方法的引用)时,它会失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)