Scala 2.10,Double.isNaN和拳击

Mys*_*Dan 5 boxing scala scala-2.10

在Scala 2.10中,someDouble.isNaN预计是盒子吗?.isNaN通过反编译器运行我的代码调用,我仍然double2Double在我的代码中看到了调用.鉴于AnyVal2.10中的新工作,我预计它不会比java.lang.Double.isNaN(someDouble)运行时更糟,没有虚假分配.我错过了什么吗?

Rex*_*err 7

不幸的是,isNaN是一个方法java.lang.Double,并且必须进行隐式转换java.lang.Double,因此Scala RichDouble值类不能重新实现isNaN为快,并且当你使用isNaN盒子时java.lang.Double.

由于这只留下缓慢或笨拙的测试方式NaN,我定义

implicit class RicherDouble(val d: Double) extends AnyVal {
  def nan = java.lang.Double.isNaN(d)
}
Run Code Online (Sandbox Code Playgroud)

然后我可以.nan用来检查.

  • @ gzm0 - 因为这个"盒子"是一个值类(即"扩展AnyVal"部分),除非你需要将它作为一个对象或泛型传递或者将它放在一个数组中,否则它实际上并没有创建.如果您只是使用它(就像您在这里一样),Scala会发出只是方法调用的字节码,因为实际上没有任何东西需要存在真实对象. (3认同)