评论者:jafingerhut
我能够在Ubuntu 12.04.2上的这些Java 6 JVMs上复现您看到的行为。
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有关。
用户=> (set! warn-on-reflection true)
true
用户=> (定义f函数,该函数传入两个参数link: a和b,(Math/abs (- a b)))
反射警告,NO_SOURCE_PATH:1:15 - 无法解析对abs的调用。
'user/f
用户=> (f 1000000000000,2000000000000)
1000000000000
用户=> (f函数返回值的class类型)
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位服务器虚拟机 (构建 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位服务器虚拟机 (构建 23.7-b01,混合模式)