Scala 2.10, Double.isNaN, and boxing

boxing, scala, scala-2.10

Solution

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.

Problem

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?

Original source