由:jafingerhut 添加评论
我能够在 Ubuntu 12.04.2 上的这些 Java 6 JVM 上重现您看到的行为。
java 版本 "1.6.0_27"
OpenJDK 运行时环境(IcedTea6 1.12.5)(6b27-1.12.5-0ubuntu0.12.04.1)
OpenJDK 64 位服务器虚拟机(构建 20.0-b12,混合模式)
java 版本 "1.6.0_45"
Java TM SE 运行时环境(构建 1.6.0_45-b06)
Java HotSpot TM 64 位服务器虚拟机(构建 20.45-b01,混合模式)
但是,我尝试了两个Java 7 JVM,并得到了以下看似更符合你期望的行为。我不知道Java 6和Java 7之间导致这种行为差异的精确区别是什么,但这是有关于Java 6与Java 7之间差异的某种证据。
用户=> (set! warn-on-reflection true)
真的
用户=> (defn f (关联: a b) (Math/abs (- a b)))
反射警告,NO_SOURCE_PATH:1:15 - 对 abs 的调用无法解析。
'user/f
用户=> (f 1000000000000 2000000000000)
1000000000000
用户=> (类别 (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(TM) 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(TM) 64位服务器VM (构建 23.7-b01,混合模式)