评论由: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 位服务器 VM (构建 20.0-b12,混合模式)
java 版本 "1.6.0_45"
Java(TM) SE 运行时环境 (构建 1.6.0_45-b06)
Java HotSpot(TM) 64 位服务器 VM (构建 20.45-b01,混合模式)
然而,我尝试了两个Java 7 JVM,它表现出以下行为,看起来更接近你希望的结果。我不知道Java 6和Java 7之间精确的区别是什么导致了这种行为差异,但这是一些证明这与Java 6与Java 7有关的证据。
用户=> (设置! 警告反射 true)
true
用户=> (定义 fn 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上观察到
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,混合模式)