Scala 将null传递给一个需要长时间的方法

Scala 将null传递给一个需要长时间的方法,scala,scala-2.8,Scala,Scala 2.8,我有一个Scala方法,它有两个参数: def test(x:Long,y:Int){} 有时我需要传递null而不是long。。。诸如此类: test(null,x) 结果是: scala>test(null,2):7:错误:类型不匹配;发现: 需要Null(Null):长 测试(空,2) 为什么我需要传递null? 实际上,由于某些原因,我无法传递任何默认值。 因此,我需要这样一个空 *注:*我知道解决方案是让它成为选项。 然而,假设我对这个方法签名没有控制权,我能做些什么吗 任何想法

我有一个Scala方法,它有两个参数:

def test(x:Long,y:Int){}
有时我需要传递null而不是long。。。诸如此类:

test(null,x)
结果是:

scala>test(null,2):7:错误:类型不匹配;发现: 需要Null(Null):长 测试(空,2)

为什么我需要传递null? 实际上,由于某些原因,我无法传递任何默认值。 因此,我需要这样一个空

*注:*我知道解决方案是让它成为选项。 然而,假设我对这个方法签名没有控制权,我能做些什么吗

任何想法


谢谢。

Null是从AnyRef继承的类型的子类型,而不是从AnyVal继承的值类型。这就是为什么不能传入null。这与java中不能有long类型的null对应。(忽略装箱的长类型)

但是,这表明该方法的签名应更改为:

def test(x: Option[Long], y: Int)

这表明有时候x没有值。因为我们有一个很好的选项类来处理这个实例,所以使用空值的理由很少(如果有的话),因为您依赖于开发人员记住检查空值。相反,使用选项,编译器将强制您注意值可能不存在的事实。

由于您不能更改签名,请考虑

的错误。 如果函数的参数为下限,则Long.MinValue可能是默认值

如果“出于某种原因,我无法传递任何默认值”(不管这可能意味着什么),您的意思是您无法向签名添加默认值,并且您正在按照另一个修改该方法的答案中建议的路线前进,那么您最好在转发之前将f(a,b)更改为g(b,a=Long.MinValue)或其他任何内容


不要让适配器方法的客户端调用g(b,None),而是让它们调用g(b)。无论如何,您不会将该选项传递给底层的f(a,b)。

将scala原语转换为Java包装类的方法是使用Java原语包装上成员的静态值。我遇到了这个问题,需要将选项[Double]转换为java.lang.Double或null。这就是我所做的:

val value: Option[Double]
val orNull = value.map(java.lang.Double.valueOf(_)).orNull

如果调用一个接受java.lang.Long/Double/Integer的方法,只需传递literal null就可以了。我完全同意应该将其作为一个选项。但是,我不能修改方法签名。我知道我说的是不合逻辑的。。但是你知道附近有什么工作吗!!那么在你打电话之前,你需要明确地处理它。是的,多米尼克。。你知道怎么做吗!!如果您有一个需要接受null的方法,并且不可能接受null,那么很明显有些东西坏了。看起来你要么需要弄清楚什么是Long有意义,要么不调用这个方法。我的意思是Echo,在调用只需要Long(而不是Option[Long])的方法并处理异常之前,只需测试null。您可以在这里编写一个
测试(x:Option[Long],y:Int)={//test for null,然后调用另一个测试方法}
,换句话说。。。。用更好的方法包装这个坏方法。您还可以使用java.lang.LongScala的
Long
实际上映射到JVM基元类型
Long
。因此,Scala
Long
不能是
null
,因为原语类型不能是
null
。(不要将
scala.Long
java.lang.Long
!)混淆。这里的问题是jdbc是java,数据库为可为空的Long存储空值。如果您在scala系统中将它们作为0L传递,那么您就是在问问题。