scala - 从 java.lang.Long 创建 Scala 选项时的意外行为

标签 scala null implicit

给出以下代码:

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来自 JavaLong .

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 的隐式转换的 LongScalaLong显然产生 0null .

只有这样我们才能转换为 Option .

如果我们指定 JavaLong作为我们的一种类型 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]使用 ScalaLong :
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/

相关文章:

arrays - 为什么数组是:+ does not work inside for comprehension?

java - 从服务器收到的 XML 响应中的特殊字符

SQL Server : help removing duplicates in alternating rows

typescript - 从类型的属性中删除 null 或 undefined

scala - 隐式参数未传递给闭包

scala - Shapeless3 和注释

java - Scala反射: how do I define a case class at runtime and then reference to it?

scala - 操作后重定向到上一页的模式

http - Flutter:单例数据,getter 在 null 上调用

scala - 如何将隐式类参数映射到特征变量?