2012-04-09 22 views
7

acabo de leer this question y tropezamos con la siguiente cita:¿Puede ser esto nulo en Scala?

Scala trata == como si se define de la siguiente manera en la clase Any:

final def == (that: Any): Boolean = 
    if (null eq this) (null eq that) else (this equals that) 

La parte (null eq this) me hizo extrañar: ¿Es ¿es realmente posible llamar a métodos en punteros nulos? ¿Puede this ser null en Scala?

+1

Está confundiendo la abstracción con la implementación. En abstracto, uno puede llamar a los métodos sobre 'null', como' == '. La implementación en la JVM, obviamente, no invoca métodos en un puntero nulo. –

Respuesta

8

Mira la Scala language specification, a saber 6.3 El valor nulo capítulo:

El valor nulo es de tipo scala.Null, y es por tanto compatible con todas las referencias tipo. Denota un valor de referencia que hace referencia a un objeto especial "nulo". Este objeto implementa métodos de la clase scala.AnyRef de la siguiente manera:

eq(x) y ==(x) retorno cierto 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".

Esto significa que semánticamente cuando se compara con algo null literal o null literal con algo que en realidad se está refiriendo a un método de una clase especial scala.Null. Trate null literal como una abreviatura de esa clase.

Por supuesto, en el nivel de implementación está optimizado y ordinarionull se utiliza.

3

null es la única instancia de la clase Null y es un objeto válido. Null es un subtipo de todos los tipos de referencia.

1

Soy bastante nuevo en Scala, pero la única forma en que veo que esto sea posible se debe al hecho de que "nulo" es una instancia de Null, y no tiene exactamente un valor especial como "null" en Java .

http://blog.sanaulla.info/2009/07/12/nothingness/

En este artículo me ayudó a entender esto un poco mejor.

Cuestiones relacionadas