评论由:jafingerhut
我能在这些 Java 6 JVM(Ubuntu 12.04.2)上重现你看到的行为。
java 版本 "1.6.0_27"
OpenJDK 运行时环境(IcedTea6 1.12.5)(6b27-1.12.5-0ubuntu0.12.04.1)
OpenJDK 64 位服务器 VM(构建 20.0-b12,混合模式)
java 版本 "1.6.0_45"
Java(SE) 运行时环境(构建 1.6.0_45-b06)
Java HotSpot 64 位服务器 VM(构建 20.45-b01,混合模式)
然而,我尝试了两个Java 7 JVM版本,并出现了以下行为,看起来与你期望的更接近。我不知道Java 6和Java 7之间究竟有什么精确的区别导致了这种行为差异,但这至少表明,这种行为可能与Java 6与Java 7的区别有关。
user=> (set! warn-on-reflection true)
true
user=> (defn f (link: a b) (Math/abs (- a b)))
反射警告,NO_SOURCE_PATH:1:15 - abs 方法的调用无法解析。
'user/f
user=> (f 1000000000000 2000000000000)
1000000000000
user=> (class (f 1000000000000 2000000000000))
java.lang.Long
在以下JVM上观察到上述行为,使用Clojure 1.5.1
Ubuntu 12.04.2并加上此JVM
java版本 "1.7.0_21"
Java™ SE运行时环境(构建1.7.0_21-b11)
Java HotSpot™ 64位服务器VM(构建23.21-b01,混合模式)
Mac OS X 10.8.3并加上此JVM
java版本 "1.7.0_15"
Java™ SE运行时环境(构建1.7.0_15-b03)
Java HotSpot™ 64位服务器VM(构建23.7-b01,混合模式)