Scala Option(null) 预期为 None 但我得到了 Some(0)

ana*_*mar 11 scala optional scala-java-interop

val i: java.lang.Integer = null
val o: Option[Int] = Option(i) // This yields Some(0)
Run Code Online (Sandbox Code Playgroud)

转换null: java.lang.Integer为 Scala的安全方法是什么Option[Int]

Mar*_*lic 21

你是混合Intjava.lang.Integer如此

val i: java.lang.Integer = null
val o: Option[Int] = Option(i)
Run Code Online (Sandbox Code Playgroud)

隐式转换为

val o: Option[Int] = Option(Integer2int(i))
Run Code Online (Sandbox Code Playgroud)

变成

val o: Option[Int] = Option(null.asInstanceOf[Int])
Run Code Online (Sandbox Code Playgroud)

因此

val o: Option[Int] = Some(0)
Run Code Online (Sandbox Code Playgroud)

如果你想和 一起工作java.lang.Integer,那么写

val o: Option[java.lang.Integer] = Option(i)
// o: Option[Integer] = None
Run Code Online (Sandbox Code Playgroud)

  • 最近有人问过这个问题,所以这是一个真正的问题。也许问题在于推理:“Option[Integer](i).map(_.intValue)”对我来说似乎是最惯用的,因为它说明了它在做什么。另外,使用“-Xlint”查看“val o”的警告! (2认同)

Jac*_*eow 7

这似乎正在发生,因为您正在创建Option,并将其转换为Int一步(@MarioGalic 的回答解释了为什么会发生这种情况)。

这做你想要的:

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)
Run Code Online (Sandbox Code Playgroud)