2012-07-05 17 views

Respuesta

5

Es realmente extraño, ya que no es el comportamiento esperado de acuerdo a la especificación:

asInstanceOf[T] devuelve el objeto null sí mismo si se ajusta a T scala.AnyRef, y lanza un NullPointerException lo contrario.

- The Scala Language Specification, Version 2.9, p. 75.

Y es un known bug que está cerrado pero relacionado con this one, que está abierto.

1

Todos esos tipos extienden AnyVal, para el cual no se puede anular un valor por asignación, por lo que los convierte en cero en respuesta a asInstanceOf, sin embargo, se me escapa. Parece que solo está haciendo esto en el REPL sin embargo, que es un caso ligeramente especial. En código real devuelve nulo.

+0

no probé en código "real" por mí mismo, pero este es el comportamiento de mi colega notó en código "real". – Michael

3

La razón es que null es un tipo de referencia - la conversión siempre se convierte en otro tipo de referencia - en este caso la versión en caja de Int o Double.

En el siguiente paso, el compilador convierte el objeto en caja a un valor primitivo. Si el objeto Int en caja es null, su valor primitivo predeterminado correspondiente es 0.

Ver: If an Int can't be null, what does null.asInstanceOf[Int] mean?

+0

Gracias. ¿Cumple con la especificación del idioma? – Michael

+0

no estoy seguro acerca de la parte con la conversión entre los valores predeterminados. – axel22

+0

Sí, parece que esta parte contradice la especificación (ver respuesta de Nicolas) – Michael