Cela a été récemment demandé quelque part, donc c'est un vrai piège. Peut-être que le problème repose sur l'inférence: cela Option[Integer](i).map(_.intValue)me semble le plus idiomatique, car il dit ce qu'il fait. Utilisez également -Xlintpour voir l'avertissement du val o!
som-snytt
Pour éviter un aller-retour de boxe, `val x: Option [Int] = Option (i) .asInstanceOf [Option [Int]]` où Integerest déduit.
som-snytt
7
Cela semble se produire parce que vous créez le Option, et le convertissez en un Inten une seule étape (@ MarioGalic's réponse de explique pourquoi cela se produit).
Le comportement vraiment discutable traite nullcomme un entier. Il s'agit vraisemblablement d'une gueule de bois d' Coù 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.
Tim
Integerprovient 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.
simpadjo
Le fait est que vous ne pouvez pas blâmer Scala pour "comportement douteux" lorsque la cause première est Java. Le conseil pratique est d'avoir une conversion explicite des types Java vers les types Scala équivalents plutôt que d'utiliser une conversion implicite. (D'où JavaConvertersplutôt que JavaConversion)
Tim
1
Eh bien, je peux et je blâme Scala de ne pas avoir émis d'erreur / avertissement de compilation dans ce cas. Même un crash d'exécution serait mieux. Même dans ma seule entreprise, 2 développeurs avec plus de 5 ans d'expérience à Scala ont rencontré ce problème.
simpadjo
1
@Tim Il serait très facile d'obtenir un crash d'exécution, en appelant simplement 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.
Réponses:
Vous mixez
Int
etjava.lang.Integer
ainsiconvertit implicitement en
qui devient
Donc
Si vous voulez travailler avec
java.lang.Integer
, écrivezla source
Option[Integer](i).map(_.intValue)
me semble le plus idiomatique, car il dit ce qu'il fait. Utilisez également-Xlint
pour voir l'avertissement duval o
!Integer
est déduit.Cela semble se produire parce que vous créez le
Option
, et le convertissez en unInt
en une seule étape (@ MarioGalic's réponse de explique pourquoi cela se produit).Cela fait ce que vous voulez:
la source
_.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 .
la source
null
comme un entier. Il s'agit vraisemblablement d'une gueule de bois d'C
où il est OK d'assigner0
à un pointeur. Mais cela ne signifie pas que le pointeur résultant est0
, il est donc douteux de basculer entre les deux même enC
.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 deOption.apply
. Nous obtenons donc une sortie inattendue sans effectuer explicitement des opérations dangereuses.JavaConverters
plutôt queJavaConversion
)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.