有一个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.Byte和java.lang.Boolean.
所以你有一个java.lang.Long,可以为null,并将它变成一个Option [ scala.Long ],如果java.lang.Long为null,则为None?
Option(javaMethod).map(_.longValue)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |