【问题标题】:Passing Scala objects as Java Object to Java methods将 Scala 对象作为 Java 对象传递给 Java 方法
【发布时间】:2019-01-02 16:42:19
【问题描述】:

我有一个接受 java.lang.Object 的 Java 方法。 现在我正在尝试将 Scala Int 传递给它,但编译器抱怨 Int 和 Object 的类型不匹配。

这感觉很奇怪,因为我认为 Scala Int 继承自 AnyRef 并且应该与 java.lang.Object 相同?

【问题讨论】:

标签: scala


【解决方案1】:

Scala Int 没有扩展 AnyRef,但它扩展了 AnyVal,它与 java.lang.Object 不兼容,更像 Java int。 Scala 也有 Integer 类,它只是 java.lang.Integer 的别名 - 如果您需要将其作为对象传递,请使用该类。

【讨论】:

    【解决方案2】:

    从 Scala 根类继承了两个 Scala 类 - 任意:

    1. AnyVal:所有基于值的类型,例如Int、Byte、Double... 等。这是 Java 原始值类的对应物,即 int、float... 等。
    2. AnyRef:所有基于引用的类型,例如String、List,包括装箱的Java类型,如java.lang.Integer...等

    (参见https://docs.scala-lang.org/tour/unified-types.html中的图表)

    AnyRef 等价于 java.lang.Object。因此,在调用Java方法取Object时,不能在装箱前直接调用AnyVal。这可以通过显式类型声明来完成:

    JavaClass.methodWithObject(10: java.lang.Integer)

    更多讨论参考: Result type of an implicit conversion must be more specific than AnyRef

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 2015-02-16
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      相关资源
      最近更新 更多