Option [Long]构造函数抛出NullPointerException

aka*_*ppi 1 java null scala

有一个Java函数应该返回一个Long但也可能返回的函数null.如何将其转换为Option[Long]Scala 2.11?我认为这将是微不足道的:

Option[Long]( f )

但是,Scala不允许AnyVals null作为值,并且导致此构造函数吐出a NullPointerException.不太好.

我觉得Scala应该做正确的事情,或者允许第二个构造函数可以在值可以使用时使用AnyVal.


更新:

以下是重现问题的方法:

scala> null.asInstanceOf[java.lang.Long]
res2: Long = null

scala> Option(res2)
res3: Option[Long] = None     # this is actually an 'Option[java.lang.Long]'

scala> Option[Long](res2)
java.lang.NullPointerException
  at scala.Predef$.Long2long(Predef.scala:358)
  ... 33 elided

scala> Option(res2).map(_.longValue)
res12: Option[Long] = None    # 'Option[scala.Long]'
Run Code Online (Sandbox Code Playgroud)

所有这些都可以在Option.scala 源代码中修复,例如:

object Option { 
    ...
    def apply(x: java.lang.Long): Option[Long] = if (x == null) None else Some(x.longValue)
Run Code Online (Sandbox Code Playgroud)

与同为相应的所有Java类型AnyValScala中:java.lang.Double,java.lang.Float,java.lang.Int,java.lang.Character,java.lang.Short,java.lang.Bytejava.lang.Boolean.

Rüd*_*ehn 7

所以你有一个java.lang.Long,可以为null,并将它变成一个Option [ scala.Long ],如果java.lang.Long为null,则为None?

Option(javaMethod).map(_.longValue)
Run Code Online (Sandbox Code Playgroud)