2011-11-27 17 views
12

Desde Int "no se ajusta a" AnyRef, no estoy seguro de por qué no lanza una NullPointerException acuerdo con Scala Reference en la Sección 6.3:¿por qué no null.asInstanceOf [Int] lanza una NullPointerException?

asInstanceOf [T] devuelve el objeto de “nulo” en sí mismo si T se ajusta a scala.AnyRef, y lanza una NullPointerException lo contrario

y tampoco lo hace null.asInstanceOf[Double], null.asInstanceOf[Boolean], null.asInstanceOf[Char].

PS: Mi biblioteca Scala es la versión 2.9.0.1 y el sistema operativo Windows XP

+0

Tengo que estar de acuerdo contigo, la especificación parece bastante clara. Debería arrojar una 'NullPointerException' o la especificación debería actualizarse. – huynhjl

+5

https://issues.scala-lang.org/browse/SI-5236 – huynhjl

+0

No hay respuesta a su pregunta, pero puede usar la adscripción de tipo cuando usa un objeto: 'val x = null: String' o' null: java.lang.Boolean'. – paradigmatic

Respuesta

5

En Scala Null es un tipo que tiene un único valor null. Como null es un valor y cada valor en Scala es un objeto, puede invocar métodos en él.

+1

Me temo que no puedo estar de acuerdo contigo. Como dice la referencia scala, Una referencia a cualquier otro miembro del objeto "nulo" hace que se genere una NullPointerException –

+3

Bueno, esto es exactamente lo que sucede. 'null.toString' por ejemplo arroja una NullPointerException. Se lanzan excepciones en el tiempo de ejecución. No puede hacer esto en Java, porque 'null' es una palabra clave de idioma allí, por lo que no se compilará. – agilesteel

-1

De hecho, es un poco sorprendente dada la sección 6.3 de language spec como se indica en el boleto por huynhjl.

El comportamiento (null.asInstanceOf[Int] le da 0) por el contrario es algo consistente con la siguiente observación:

new Array[AnyRef](3) // -> Array(null, null, null) 
new Array[Int ](3) // -> Array(0, 0, 0) 

y como tal puede ser útil en una clase genérica cuando se quiere tener 'un valor' para el tipo X, incluso si no tiene un valor particular disponible. Como en la segunda observación:

class X[A] { 
    var value: A = _ 
} 

new X[Int].value // -> 0 (even if X is not specialized in A, hmmm....) 
Cuestiones relacionadas