给出以下代码:
val javaLong: java.lang.Long = null
val opt: Option[Long] = Option(javaLong)
我希望选择是
None
但由于某种原因,它是 Some(0)
.我也发现了这个 bug并且似乎隐式转换发生在选项的 apply 方法之前。我认为这仍然是一个错误,因为人们不会期望这种行为,我想知道是否有任何解决方法或更好的方法来包装空值。
更新 :
上面的代码只是一个简化的部分。真实的例子是这样的:
Person(Option(doc.getLong()))
其中人是:
case class Person(id: Option[Long])
和方法
doc.getLong()
是返回 java.lang.Long 的 java 方法
最佳答案
转换为 Option[Long]
实际上不仅仅是转换为 Option
但也是对 Scala
的隐式转换的 Long
来自 Java
的 Long
.
val javaLong: java.lang.Long = null
// javaLong: Long = null
val long: java.lang.Long = javaLong
// long: Long = null
val long: Long = javaLong
// long: Long = 0
首先我们有来自
Java
的隐式转换的 Long
至 Scala
的 Long
显然产生 0
出null
.只有这样我们才能转换为
Option
.如果我们指定
Java
的 Long
作为我们的一种类型 Option
然后我们确实得到了 None
而不是 Some(0)
:val opt: Option[java.lang.Long] = Option(javaLong)
// opt: Option[Long] = None (here it's Java's Long)
我们终于可以投
Option[java.lang.Long]
使用 Scala
的 Long
:val opt: Option[Long] = Option(javaLong).map(_.toLong)
// opt: Option[Long] = None (here it's Scala's Long)
关于scala - 从 java.lang.Long 创建 Scala 选项时的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52744539/