【问题标题】:Pass null to a method expects Long将 null 传递给需要 Long 的方法
【发布时间】:2012-11-18 05:42:06
【问题描述】:

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

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

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

test(null,x)

结果:

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

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

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

任何想法!

谢谢。

【问题讨论】:

  • 你也可以使用 java.lang.Long
  • Scala 的 Long 实际上映射到 JVM 原始类型 long。因此,Scala Long 不能是 null,因为原始类型不能是 null。 (不要将scala.Long 与java.lang.Long 混淆!)。
  • 这里的问题是 jdbc 是 java 和数据库存储 null 值的可空长。如果你在 scala 系统中将它们作为 0L 传递,你就是在问问题。

标签: scala scala-2.8


【解决方案1】:

Null 是继承自 AnyRef 的类型的子类型,而不是继承自 AnyVal 的值类型。这就是为什么你不能传入 null 的原因。这对应于在 java 中你不能有一个 long 类型的 null。 (忽略盒装的 Long 类型)。

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

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

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

【讨论】:

  • 我完全同意它应该作为一个选项。但是,我不能修改方法签名。我知道我说的是不合逻辑的..但是你知道任何解决方法吗! !
  • 那么你需要在调用之前明确处理它。
  • 是的 Dominic .. 你有什么想法吗!!
  • 如果你有一个方法需要接受一个空值并且不可能接受一个空值,那么显然有些东西坏了。似乎您要么需要弄清楚 Long 是什么意思,要么不调用此方法。
  • 我的意思是 Echo,只是在调用只需要 Long(而不是 Option[Long])的方法并在那里处理异常之前测试 null。你可以写一个test(x: Option[Long], y: Int) = { //test for null here, and THEN call your other test method } 换句话说....用更好的东西包装坏方法。
【解决方案2】:

由于不能更改签名,请考虑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)。无论如何,您都没有将 Option 传递给底层 f(a,b)。

【讨论】:

    【解决方案3】:

    将 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 应该可以工作

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2010-09-07
      相关资源
      最近更新 更多