Es geht nicht um Scala NaN vs. Java - es gibt nur eine NaN:
scala> val a = Double.NaN
a: Double = NaN
scala> val b = java.lang.Double.NaN
b: Double = NaN
Auch ist es nicht dass es zwei Objekte mit dem gleichen Wert gibt. Es ist ungefähr the definition of NaN. Zwei NaNs sind nicht ==, denn so ist NaN definiert - es ist keine Zahl, sondern ein spezieller Wert, der "undefined" bedeutet. Wenn du zwei davon hast, wie würdest du wissen, ob sie gleich sind? Zum Beispiel:
scala> val x = 0.0/0.0
x: Double = NaN
scala> val y = Math.sqrt(-1)
y: Double = NaN
scala> x == y
res9: Boolean = false
Glücklicherweise sind sie nicht ==; Sie sind keine Zahlen, deren Werte Sie vergleichen können.
Wie für x.equals(y)
, nun, warum würden Sie das in Scala tun? Aber da du es getan hast, rennst du in die seltsame Java-Verrücktheit, die ich kenne. wies uns auf the docs für. Lassen Sie uns zeigen es:
public class Foo {
public static void main(String[] args) {
double nan1 = 0.0/0.0; Double box1 = nan1;
double nan2 = Math.sqrt(-1); Double box2 = nan2;
System.out.println(nan1 == nan2); // false, as expected
System.out.println(box1.equals(box2)); // true -- WTF???
}
}
Ihr Wert ist gleich, aber ihre Instanz ist nicht. – Obicere
@Obicere, könnten Sie Ihre Antwort erweitern und erläutern, welcher dieser Operatoren den Referenzvergleich durchführt und welcher den Wertevergleich durchführt? –
Einige Diskussionen dazu auf dem Alias scala-Sprache: https://groups.google.com/forum/#!msg/scala-Sprache/LJGpb1wDjI4/HgE8jcGbL0YJ – AmigoNico