Scala 2.10, Double.isNaN, and boxing

2019-06-21 06:11发布

In Scala 2.10, is someDouble.isNaN expected to box? Running my code calling .isNaN through a decompiler, I still see telltale calls to double2Double in my code. Given the new AnyVal work in 2.10, I'd expect it to be no worse than java.lang.Double.isNaN(someDouble) at runtime with no spurious allocations. Am I missing something?

1条回答
兄弟一词,经得起流年.
2楼-- · 2019-06-21 06:47

Unfortunately, isNaN is a method on java.lang.Double, and it is essential to have an implicit conversion to java.lang.Double, so the Scala RichDouble value class cannot reimplement isNaN to be fast, and when you use isNaN you box to java.lang.Double.

Since this leaves only slow or awkward ways to test for NaN, I define

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

and then I can just use .nan to check.

查看更多
登录 后发表回答