val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)
Quel est le moyen sûr de se convertir null: java.lang.Integer
à Scala Option[Int]
?
val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)
Quel est le moyen sûr de se convertir null: java.lang.Integer
à Scala Option[Int]
?
Réponses:
Vous mixez Int
et java.lang.Integer
ainsi
val i: java.lang.Integer = null
val o: Option[Int] = Option(i)
convertit implicitement en
val o: Option[Int] = Option(Integer2int(i))
qui devient
val o: Option[Int] = Option(null.asInstanceOf[Int])
Donc
val o: Option[Int] = Some(0)
Si vous voulez travailler avec java.lang.Integer
, écrivez
val o: Option[java.lang.Integer] = Option(i)
// o: Option[Integer] = None
Option[Integer](i).map(_.intValue)
me semble le plus idiomatique, car il dit ce qu'il fait. Utilisez également -Xlint
pour voir l'avertissement du val o
!
Integer
est déduit.
Cela semble se produire parce que vous créez le Option
, et le convertissez en un Int
en une seule étape (@ MarioGalic's réponse de explique pourquoi cela se produit).
Cela fait ce que vous voulez:
scala> val o: java.lang.Integer = null
o: Integer = null
scala> val i: Option[Int] = Option(o).map(_.toInt)
i: Option[Int] = None
scala> val o1: java.lang.Integer = 1
o1: Integer = 1
scala> val i1: Option[Int] = Option(o1).map(_.toInt)
i1: Option[Int] = Some(1)
_.intValue
. Je suppose que cela enregistre uniquement l'appel de conversion.
Face au même problème auparavant. Ce comportement douteux est connu de l'équipe Scala. Il semble que le changer brise quelque chose ailleurs. Voir https://github.com/scala/bug/issues/11236 et https://github.com/scala/scala/pull/5176 .
null
comme un entier. Il s'agit vraisemblablement d'une gueule de bois d' C
où il est OK d'assigner 0
à un pointeur. Mais cela ne signifie pas que le pointeur résultant est 0
, il est donc douteux de basculer entre les deux même en C
.
Integer
provient très probablement du code Java, donc «ne pas traiter null comme un entier» n'est pas un conseil exploitable. Et nous vérifions explicitement la nullité de cet entier à l'aide de Option.apply
. Nous obtenons donc une sortie inattendue sans effectuer explicitement des opérations dangereuses.
JavaConverters
plutôt que JavaConversion
)
theInteger.intValue()
. Éviter ce plantage est ce qui coûte une vérification supplémentaire de l'exécution. Dans les anciennes versions de Scala, cette conversion produisait en effet un NPE; il a été signalé comme bogue et corrigé au comportement actuel. Je ne suis pas un expert Scala, mais j'ai déterré scala-dev # 355 et scala # 5176 comme contexte historique.