Scala Option(null) expected as None but I got Some(0)

Viewed 1825
val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)

What is the safe way to convert null: java.lang.Integer to Scala Option[Int]?

3 Answers

You are mixing Int and java.lang.Integer so

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

implicitly converts to

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

which becomes

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

thus

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

If you want to work with java.lang.Integer, then write

val o: Option[java.lang.Integer] = Option(i)
// o: Option[Integer] = None

This seems to be happening because you are creating the Option, and converting it to an Int in one step (@MarioGalic's answer explains why this is happening).

This does what you want:

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)
Related