9
votes

Casting null à int et double à Scala

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


0 commentaires

3 Réponses :


6
votes

C'est vraiment étrange, car ce n'est pas le comportement attendu en fonction de la spécification:

asinstance de [t] renvoie l'objet null si t est conforme à scala.anyref et jette un nullpointException sinon.

- La spécification de la langue Scala, la version 2.9 , p. 75.

et c'est un Bug connu qui est fermé mais lié à Celui-ci , qui est ouvert.


1 commentaires

OK, exemple complet val x = null.asinstance de [string]



1
votes

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.


1 commentaires

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".



3
votes

La raison est que null 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 ou double .

Dans l'étape suivante, le compilateur convertit l'objet en boîte à une valeur primitive. Si l'objet Boxed int est null , sa valeur primitive par défaut correspondante est 0 .

Voir: si un INT peut ' t être null, qu'est-ce que null.asinstance de [int] signifie?


3 commentaires

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)