将null传递给期望Long的方法

Ech*_*cho 3 scala scala-2.8

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

def test(x:Long,y:Int){}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我需要传递null而不是long ...类似的东西:

test(null,x)
Run Code Online (Sandbox Code Playgroud)

结果:

scala> test(null,2):7:错误:类型不匹配; found:Null(null)required:长测试(null,2)

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

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

有任何想法吗!

谢谢.

ste*_*tew 8

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

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

def test(x: Option[Long], y: Int)
Run Code Online (Sandbox Code Playgroud)

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


som*_*ytt 3

由于您无法更改签名,因此请考虑Thinking Option[Foo] is the only/most nature way toexpress a Missing function argument的错误。

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

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

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