我有一个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.
*注意:*我知道解决方案是选择它.但是,假设我无法控制此方法签名,我可以做任何解决方法吗?
有任何想法吗!
谢谢.
Null是从AnyRef继承的类型的子类型,而不是从AnyVal继承的值类型.这就是你无法传入null的原因.这对应于在java中你不能使用long类型的null.(忽略盒装Long类型).
但是,这表明该方法的签名应更改为:
def test(x: Option[Long], y: Int)
Run Code Online (Sandbox Code Playgroud)
这表明有时它对x没有价值.由于我们有这个很好的Option类来处理这个实例,因此几乎没有任何正当理由可以使用空值,在这里你依赖开发人员记住要检查空值.相反,使用Option,编译器将强制您处理值可能不存在的事实.
如果函数的参数是下限,那么 Long.MinValue 可能是自然的默认值。
如果“由于某种原因,我无法传递任何默认值”(无论这可能意味着什么),您的意思是您无法将默认值添加到签名中,并且您将采用另一个适应该方法的答案中建议的路线,您不妨在转发之前将 f(a,b) 更改为 g(b, a=Long.MinValue) 或其他内容。
不要让适配器方法的客户端调用 g(b, None),而是让它们调用 g(b)。无论如何,您都不会将 Option 传递给底层 f(a,b) 。
| 归档时间: |
|
| 查看次数: |
9701 次 |
| 最近记录: |