从java.lang.Long创建Scala选项时出现意外行为

时间:2018-10-10 16:09:10

标签: scala null implicit

给出以下代码:

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

的java方法。

1 个答案:

答案 0 :(得分:3)

Option[Long]的转换实际上不仅是向Option的转换,而且是从ScalaLong的{​​{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)