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?