在Scala中,如何将null传递给需要较长时间的Java方法?

在Scala中,如何将null传递给需要较长时间的Java方法?,java,scala,interop,null,Java,Scala,Interop,Null,我有一个接受长值的Java方法: (in Java) public void setValue(Long value); 我知道Scala null不扩展任何值类型,包括Long。因此,当我尝试将null传递给它时,会出现编译错误: (in Scala) javaThing.setValue(null) ==> type mismatch; found : Any required: java.lang.Long 编辑:啊!忽略上面的代码片段。我把问题简单化了,惹上了麻烦。事实上,

我有一个接受长值的Java方法:

(in Java)
public void setValue(Long value);
我知道Scala null不扩展任何值类型,包括Long。因此,当我尝试将null传递给它时,会出现编译错误:

(in Scala)
javaThing.setValue(null)

==> type mismatch; found  : Any required: java.lang.Long
编辑:啊!忽略上面的代码片段。我把问题简单化了,惹上了麻烦。事实上,问题源于我使用选项[Long],如下所示:

javaThing.setValue(calcValue.getOrElse(null))
我认为问题在于,当给定一个null参数时,getOrElse的计算结果是Any类型


救命啊

就我所记得的,除了选择long值来像null一样工作之外,没有其他方法。通常使用的是-1。

我在这里无法复制

JavaTst.java:

public class JavaTst {
    public void setValue(Long value) {}
}
答复:

编辑

啊哈!在这种情况下,此卷积代码将起作用:

res0.setValue(calcValue.map(new java.lang.Long(_)).getOrElse(null))
scala> val l:java.lang.Long = Some(2L).getOrElse(null).asInstanceOf[java.lang.Long]
l: java.lang.Long = 2

scala> val n:java.lang.Long = None.getOrElse(null).asInstanceOf[java.lang.Long]    
n: java.lang.Long = null

我建议将java.lang.Long导入到jlong,以使其更短。

使用
asInstanceOf
显式强制转换将起作用:

res0.setValue(calcValue.map(new java.lang.Long(_)).getOrElse(null))
scala> val l:java.lang.Long = Some(2L).getOrElse(null).asInstanceOf[java.lang.Long]
l: java.lang.Long = 2

scala> val n:java.lang.Long = None.getOrElse(null).asInstanceOf[java.lang.Long]    
n: java.lang.Long = null
因此,类似这样的方法应该会奏效:

javaThing.setValue(calcValue.getOrElse(null).asInstanceOf[java.lang.Long])
它颠覆了类型系统,但首先使用
null
也是如此。

甚至更短:

null.asInstanceOf[Long]
使用.orNull:


setValue(calcValue.orNull)

lol我想不出比在stackoverflow上提问更快的方法来在13分钟内登上google热门列表的顶端:问题似乎是在Scala:Scala>class JavaTst(){def setValue(value:Long){}中定义方法时定义类JavaTst scala>new JavaTst res4:JavaTst=JavaTst@4fb529d6scala>res4.setValue(null):8:错误:类型不匹配;找到:Null(Null)必需:Long res4.setValue(Null)^您完全正确。我已经纠正了我对问题的错误描述,这与选项[Long]的使用有关。为沟通失误道歉。嗯。我不理解calcValue.map(new java.lang.Long(551;)的解决方案;这是怎么回事?@David Scala的
Long
是一个
AnyVal
,因此,没有
null
作为可能的值。因此,我将它映射到一个
java.lang.Long
,这是有可能的。一旦完成了,Scala就可以推断
java.lang.Long
的类型
null
,而ode>Long。