【问题标题】:In Scala, how can I pass null to a Java method that expects Long?在 Scala 中,如何将 null 传递给需要 Long 的 Java 方法?
【发布时间】:2011-04-21 13:57:12
【问题描述】:

我有一个接受 Long 值的 Java 方法:

(in Java)
public void setValue(Long value);

我了解 Scala null 不扩展任何值类型,包括 Long。因此,当我尝试将 null 传递给它时,会出现编译错误:

(in Scala)
javaThing.setValue(null)

==> type mismatch; found  : Any required: java.lang.Long

编辑:啊!忽略上面的sn-p。我把问题简单化了,惹上了麻烦。其实问题出在我使用Option[Long],如下:

javaThing.setValue(calcValue.getOrElse(null))

我认为,问题在于,当给定一个空参数时,getOrElse 的计算结果为 Any 类型。

救命!

【问题讨论】:

  • 哈哈,我想不出比在 stackoverflow 上提问更快的方法来在 13 分钟内到达谷歌热门列表的顶部:google.com/…

标签: java scala interop null


【解决方案1】:

使用asInstanceOf 显式转换将起作用:

scala> val l:java.lang.Long = Some(2L).getOrElse(null).asInstanceOf[java.lang.Long]
l: java.lang.Long = 2

scala> val n:java.lang.Long = None.getOrElse(null).asInstanceOf[java.lang.Long]    
n: java.lang.Long = null

所以,这样的事情应该可以工作:

javaThing.setValue(calcValue.getOrElse(null).asInstanceOf[java.lang.Long])

它颠覆了类型系统,但首先使用 null 也是如此。

【讨论】:

    【解决方案2】:

    甚至更短:

    null.asInstanceOf[Long]
    

    【讨论】:

      【解决方案3】:

      我无法在这里重现。

      JavaTst.java:

      public class JavaTst {
          public void setValue(Long value) {}
      }
      

      REPL:

      scala> new JavaTst
      res0: JavaTst = JavaTst@4e229e
      
      scala> res0.setValue(null)
      
      scala>
      

      编辑

      啊哈!在这种情况下,这个复杂的代码将起作用:

      res0.setValue(calcValue.map(new java.lang.Long(_)).getOrElse(null))
      

      我建议将 java.lang.Long 导入 jlLong,以使其更短。

      【讨论】:

      • 问题似乎出在Scala中定义方法时: scala> class JavaTst() { def setValue(value: Long) {} } defined class JavaTst scala> new JavaTst res4: JavaTst = JavaTst @4fb529d6 scala> res4.setValue(null) :8: 错误:类型不匹配;发现:Null(null) required: Long res4.setValue(null) ^
      • 你是完全正确的。我已经更正了我对问题的错误描述,这与使用 Option[Long] 有关。对沟通不畅表示歉意。
      • 嗯。我不明白 calcValue.map(new java.lang.Long(_); 那里发生了什么?
      • @David Scala 的LongAnyVal,因此没有null 作为可能的值。所以我将它映射到java.lang.Long,确实如此。一旦完成,Scala 就可以推断出null 的类型java.lang.Long,而Long 则不能。
      【解决方案4】:

      据我所知,除了选择 long 值来像 null 一样工作之外,没有其他办法。通常使用 -1。

      【讨论】:

        【解决方案5】:

        使用 .orNull:

        javaThing.setValue(calcValue.orNull)

        【讨论】:

          猜你喜欢
          • 2012-11-18
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多