2012-07-05 10 views

risposta

5

è davvero strano, in quanto non è il comportamento previsto in base alle specifiche:

asInstanceOf[T] restituisce l'oggetto in sé null se T conforme alle scala.AnyRef, e lancia un NullPointerException altrimenti.

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

Ed è un known bug che è chiuso, ma legato alla this one, che è aperto.

1

Quei tipi tutti estendono AnyVal, per cui un valore non può essere nullo per assegnazione, il motivo per cui li trasforma in zero in risposta a asInstanceOf tuttavia mi sfugge. Sembra che stia facendo solo questo nel REPL, che è un caso leggermente speciale. Nel codice reale restituisce null.

+0

non ho provato in codice "reale" da me, ma questo è il comportamento mio collega ha notato in codice "reale". – Michael

3

Il motivo è che null è un tipo di riferimento: la trasmissione viene sempre convertita in un altro tipo di riferimento, in questo caso la versione in scatola di Int o Double.

Nel passaggio successivo, il compilatore converte l'oggetto in scatola in un valore primitivo. Se l'oggetto in scatola Int è null, il valore primitivo predefinito corrispondente è 0.

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

+0

Grazie. È conforme alle specifiche della lingua? – Michael

+0

non sicuro della parte con la conversione tra valori predefiniti. – axel22

+0

Sì, sembra che questa parte contraddica le specifiche (vedere la risposta di Nicolas) – Michael