Cuando ambos lados de la ==
esnull
o si el primer operando de ==
evalúa como nulo, Scala no invocar equals
. Entonces, en este caso, sí, x == null
es lo mismo que x eq null
; el método equals
es no invocado. Presta atención a los casos a continuación.
Considera:
class X {
// this is just for testing
// any equals that returns true when the other object is null
// is arguably broken. thus even though it may be invoked
// the end semantics should remain the same
override def equals(x: Any) = true
}
var x = new X()
x == null // false -- compiler optimization?
null == x // false
var y = null
y == x // false -- see documentation below, y is null, x is not
x == y // true -- x does not evaluate to null, equals invokes
x eq y // false
y observe que:
(new X()) == null
resultados en una advertencia diciendo un "un objeto fresca" nunca será igual (a null).
Sospecho que puede haber un código ligeramente más/diferente emitido para x == y
que x == null
(en caso de que los iguales se deben invocar), pero no se han verificado.
Happy coding.
Sección 6.3 (el valor nulo) de la especificación del lenguaje Scala tiene esto que decir:
El valor nulo es de tipo scala.Null, y es por tanto compatible con todas las referencias tipo. Denota un valor de referencia que se refiere a un objeto especial "nulo". Este objeto implementa métodos en scala.AnyRef clase como sigue:
- [nulo] eq (x) y [nulo] == (x) devolver verdadero si y sólo si el argumento x es también el objeto “nulo”.
- ne (x) y! = (X) devuelve verdadero si el argumento x no es también el objeto "nulo".
- isInstanceOf [T] siempre devuelve falso.
- asInstanceOf [T] devuelve el objeto "nulo" si T cumple con scala.AnyRef, y arroja una excepción NullPointerException en caso contrario.
Una referencia a cualquier otro miembro del objeto "nulo" provoca que se genere una NullPointerException.
Pero, para comparar con 'null', ¿hay alguna diferencia? ¿Puedo usar 'null == last' aquí? – Freewind