评论者:jafingerhut
我能在 Ubuntu 12.04.2 上的 Java 6 JVM 上重现您所看到的行为
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.5) (6b27-1.12.5-0ubuntu0.12.04.1)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
然而,我尝试了两个 Java 7 JVM,它给出了以下行为,看起来更接近您所期望的结果。我不知道 Java 6 和 Java 7 之间有什么精确的区别导致了这种行为差异,但这确实是与 Java 6 和 Java 7 有关的一些证据。
user=> (set! warn-on-reflection true)
true
用户=> (defn f (link: a b) (Math/abs (- a b)))
反射警告,NO_SOURCE_PATH:1:15 - 无法解决 abs 的调用。
'user/f
用户=> (f 1000000000000 2000000000000)
1000000000000
用户=> (class (f 1000000000000 2000000000000))
java.lang.Long
在Clojure 1.5.1和以下JVM上观察到上述行为
Ubuntu 12.04.2加上此JVM
java版本 "1.7.0_21"
Java TM SE运行环境(构建 1.7.0_21-b11)
Java HotSpot TM 64位服务器虚拟机(构建 23.21-b01,混合模式)
Mac OS X 10.8.3加上此JVM
java版本 "1.7.0_15"
Java TM SE运行环境(构建 1.7.0_15-b03)
Java HotSpot TM 64位服务器虚拟机(构建 23.7-b01,混合模式)