将null传递给期望Long的方法

时间:2012-11-30 01:46:41

标签: scala scala-2.8

我有一个带有2个参数的Scala方法:

def test(x:Long,y:Int){}

在某些情况下,我需要传递null而不是long ......就像那样:

test(null,x)

结果:

  

阶> test(null,2):7:错误:类型不匹配;发现:   需要Null(null):Long          试验(零,2)

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

* 注意: *我知道解决方案是将它作为选项。 但是,假设我无法控制此方法签名,我可以做任何解决方法吗?

任何想法!

感谢。

3 个答案:

答案 0 :(得分:8)

Null是从AnyRef继承的类型的子类型,而不是从AnyVal继承的值类型。这就是你无法传入null的原因。这对应于在java中你不能使用long类型的null。 (忽略盒装的Long类型)。

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

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

表示有时它没有x的值。由于我们有这个很好的Option类来处理这个实例,因此几乎没有任何正当理由可以使用null值,而你依赖开发人员记住要检查空值。相反,使用Option,编译器将强制您处理值可能不存在的事实。

答案 1 :(得分:3)

由于您无法更改签名,请考虑Thinking Option[Foo] is the only/most natural way to express a missing function argument

的错误

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

如果“由于某种原因,我无法传递任何默认值”(无论可能意味着什么),你的意思是你不能在签名中添加默认值,而你要在另一个答案中建议路线调整方法,你也可以在转发之前将f(a,b)更改为g(b,a = Long.MinValue)或其他任何内容。

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

答案 2 :(得分:0)

将scala原语转换为Java包装类的方法是使用Java Primitive包装器上的静态valueOf成员。我有这个问题,我需要将Option [Double]转换为java.lang.Double或null。这就是我所做的:

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

如果要调用接受java.lang.Long / Double / Integer的方法

,只传递文字null应该有效