我有一个带有2个参数的Scala方法:
def test(x:Long,y:Int){}
在某些情况下,我需要传递null而不是long ......就像那样:
test(null,x)
结果:
阶> test(null,2):7:错误:类型不匹配;发现: 需要Null(null):Long 试验(零,2)
为什么我需要传递null? 实际上,由于某种原因,我无法传递任何默认值。 因此,我需要这样的空。
* 注意: *我知道解决方案是将它作为选项。 但是,假设我无法控制此方法签名,我可以做任何解决方法吗?
任何想法!
感谢。
答案 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应该有效