Isso foi solicitado recentemente em algum lugar, por isso é uma verdadeira pegadinha. Talvez o problema esteja na inferência: Option[Integer](i).map(_.intValue)parece-me mais idiomático, pois diz o que está fazendo. Além disso, use -Xlintpara ver o aviso para o val o!
som-snytt 9/03
Para evitar uma ida e volta de boxe, `val x: Option [Int] = Opção (i) .asInstanceOf [Option [Int]]` onde Integeré inferido.
som-snytt 9/03
7
Isso parece estar acontecendo porque você está criando Optione convertendo-o Intem uma etapa (a resposta de @ MarioGalic explica por que isso está acontecendo).
O comportamento realmente questionável é tratar nullcomo um número inteiro. Presumivelmente, é uma ressaca de Conde não há problema em atribuir 0a um ponteiro. Mas isso não significa que o ponteiro resultante seja 0, portanto, é complicado alternar entre os dois C.
Tim
Integerprovavelmente veio do código Java, portanto, 'não trate nulo como um número inteiro' não é um conselho acionável. E verificamos explicitamente esse número inteiro quanto à nulidade usando Option.apply. Portanto, obtemos resultados inesperados sem executar explicitamente operações inseguras.
simpadjo 9/03
O ponto é que você não pode culpar a Scala por "comportamento questionável" quando a causa raiz é Java. O conselho acionável é ter uma conversão explícita dos tipos Java para os tipos Scala equivalentes, em vez de usar a conversão implícita. (Portanto, em JavaConvertersvez de JavaConversion)
Tim
11
Bem, eu posso e culpo o Scala por não emitir erro / aviso de compilação neste caso. Mesmo falha de tempo de execução seria melhor. Mesmo na minha empresa, apenas 2 desenvolvedores com mais de 5 anos de experiência em Scala atingiram esse problema.
simpadjo 9/03
11
@ Tim Seria muito fácil obter uma falha de tempo de execução, simplesmente chamando theInteger.intValue(). Evitar essa falha é o que custa uma verificação de tempo de execução extra. Nas versões mais antigas do Scala, essa conversão realmente produziu um NPE; foi relatado como um bug e corrigido para o comportamento atual. Não sou especialista em Scala, mas descobri o scala-dev # 355 e o scala # 5176 como contexto histórico.
Respostas:
Você está misturando
Int
ejava.lang.Integer
entãoconverte implicitamente em
que se torna
portanto
Se você deseja trabalhar
java.lang.Integer
, escrevafonte
Option[Integer](i).map(_.intValue)
parece-me mais idiomático, pois diz o que está fazendo. Além disso, use-Xlint
para ver o aviso para oval o
!Integer
é inferido.Isso parece estar acontecendo porque você está criando
Option
e convertendo-oInt
em uma etapa (a resposta de @ MarioGalic explica por que isso está acontecendo).Isso faz o que você deseja:
fonte
_.intValue
. Acho que só salva a chamada de conversão.Enfrentou o mesmo problema antes. Esse comportamento questionável é conhecido pela equipe Scala. Parece que mudá-lo quebra algo em outro lugar. Consulte https://github.com/scala/bug/issues/11236 e https://github.com/scala/scala/pull/5176 .
fonte
null
como um número inteiro. Presumivelmente, é uma ressaca deC
onde não há problema em atribuir0
a um ponteiro. Mas isso não significa que o ponteiro resultante seja0
, portanto, é complicado alternar entre os doisC
.Integer
provavelmente veio do código Java, portanto, 'não trate nulo como um número inteiro' não é um conselho acionável. E verificamos explicitamente esse número inteiro quanto à nulidade usandoOption.apply
. Portanto, obtemos resultados inesperados sem executar explicitamente operações inseguras.JavaConverters
vez deJavaConversion
)theInteger.intValue()
. Evitar essa falha é o que custa uma verificação de tempo de execução extra. Nas versões mais antigas do Scala, essa conversão realmente produziu um NPE; foi relatado como um bug e corrigido para o comportamento atual. Não sou especialista em Scala, mas descobri o scala-dev # 355 e o scala # 5176 como contexto histórico.