给出以下代码:
val javaLong: java.lang.Long = null
val opt: Option[Long] = Option(javaLong)
我希望 opt 为None
,但由于某种原因,它是Some(0)
。我还发现了这个bug,并且似乎隐式转换发生在option的apply方法之前。
我认为这仍然是一个错误,因为人们不会期望这种行为,而且我想知道是否有任何替代方法或一些更好的方法来包装null。
更新: 上面的代码只是一个简化的部分。真正的例子是这样的:
Person(Option(doc.getLong()))
人物在哪里:
case class Person(id: Option[Long])
和方法doc.getLong()
是返回java.lang.Long
答案 0 :(得分:3)
向Option[Long]
的转换实际上不仅是向Option
的转换,而且是从Scala
到Long
的{{1}}的隐式转换。 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
的{{1}}到Java
的{{1}}的隐式转换,这显然从Long
中产生了Scala
只有这样我们才能转换为Long
。
如果我们将0
的{{1}}指定为null
的类型,那么我们会得到Option
而不是Java
:
Long
我们最终可以将Option
转换为使用None
的{{1}}:
Some(0)