Dupliqué possible: strong>
Si un Int ne peut pas être null, quoi Null.ASInstance de [int] signifie-t-il? P>J'ai essayé ce qui suit dans RÉPL: P>
scala> null.asInstanceOf[Int] res12: Int = 0 scala> null.asInstanceOf[Float] res13: Float = 0.0 scala> null.asInstanceOf[Double] res14: Double = 0.0
3 Réponses :
C'est vraiment étrange, car ce n'est pas le comportement attendu en fonction de la spécification: p>
asinstance de [t] code> renvoie l'objet code> null code> si
t code> est conforme à
scala.anyref code> et jette un
nullpointException code> sinon. p>
- La spécification de la langue Scala, la version 2.9 9 , p. 75. P> blockQuote>
et c'est un Bug connu qui est fermé mais lié à Celui-ci , qui est ouvert. P>
OK, exemple complet val x = null.asinstance de [string] code>
Ces types étendent tous, pour lesquels une valeur ne peut être nulle par affectation, la raison pour laquelle il les transforme en zéro en réponse à AsinStance of Th' Il semble ne faire que cela dans la replativement, ce qui est un cas légèrement spécial. En vrai code, il renvoie NULL. P>
Je ne l'ai pas essayé dans un code "réel" par moi-même, mais c'est le comportement mon collègue remarqué dans le code "réel".
La raison est que Dans l'étape suivante, le compilateur convertit l'objet en boîte à une valeur primitive. Si l'objet Boxed Voir: si un INT peut ' t être null, qu'est-ce que null.asinstance de [int] signifie? p> null code> est un type de référence - la coulée de référence convertit toujours vers un autre type de référence - dans ce cas, la version en boîte de
int code> ou
double code>. p>
int code> est
null code>, sa valeur primitive par défaut correspondante est
0 code>. P>
Merci. Est-ce que cela se conformait à la spécification de la langue?
Pas sûr de la partie avec la conversion entre les valeurs par défaut.
Oui, il semble que cette partie contredit la spécification (voir la réponse de Nicolas)