Answers:
你在混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
Option[Integer](i).map(_.intValue)
在我看来,这是最惯用的,因为它说明了正在做什么。另外,还可-Xlint
用于查看val o
!的警告。
Integer
可以推断出val x:Option [Int] = Option(i).asInstanceOf [Option [Int]] 。
这似乎正在发生,因为您正在创建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)
_.intValue
。我猜它只保存转换调用。
以前也遇到过同样的问题。Scala团队知道这种可疑的行为。似乎更改它会破坏其他地方的东西。见https://github.com/scala/bug/issues/11236和https://github.com/scala/scala/pull/5176。
null
视为整数。大概这是一个宿醉,可以从该宿醉C
分配0
给一个指针。但这并不意味着结果的指针是0
,因此甚至在C
。
Integer
最有可能来自Java代码,因此“不要将null视为整数”不是可行的建议。然后,我们使用明确检查此Integer是否可为空Option.apply
。因此,我们得到了意外的输出,没有明确地执行任何不安全的操作。
JavaConverters
而不是JavaConversion
)
theInteger.intValue()
。避免崩溃是需要额外的运行时检查的成本。在旧版本的Scala中,这种转换的确产生了NPE。它被报告为错误,并已修复为当前行为。我不是Scala专家,但是我挖出了scala-dev#355和scala#5176作为历史背景。