Scala Опция (ноль) ожидается как None, но я получил некоторые (0) - PullRequest
9 голосов
/ 09 марта 2020
val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)

Как безопасно конвертировать null: java.lang.Integer в Scala Option[Int]?

Ответы [ 3 ]

17 голосов
/ 09 марта 2020

Вы смешиваете Int и java.lang.Integer, поэтому

val i: java.lang.Integer = null
val o: Option[Int] = Option(i)

неявно преобразуется в

val o: Option[Int] = Option(Integer2int(i))

, который становится

val o: Option[Int] = Option(null.asInstanceOf[Int])

, таким образом

val o: Option[Int] = Some(0)

Если вы хотите работать с java.lang.Integer, напишите

val o: Option[java.lang.Integer] = Option(i)
// o: Option[Integer] = None
7 голосов
/ 09 марта 2020

Похоже, это происходит потому, что вы создаете Option и конвертируете его в Int за один шаг (@ MarioGali c answer объясняет, почему это происходит).

Это делает то, что вы хотите:

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)
1 голос
/ 09 марта 2020

Столкнулся с той же проблемой раньше. Это сомнительное поведение известно команде Scala. Кажется, что изменение его ломает что-то в другом месте. См. https://github.com/scala/bug/issues/11236 и https://github.com/scala/scala/pull/5176.

...