【问题标题】:Scala object-nested classes in Eclipse JavaEclipse Java 中的 Scala 对象嵌套类
【发布时间】:2012-04-20 20:59:11
【问题描述】:

在使用 Eclipse IDE 时,我无法从 Java 代码中引用 Scala 类。有问题的 Scala 类嵌套在 Scala 对象结构中。当尝试在 Java 代码中使用该类时,Eclipse 抱怨使用二进制名称。

以下是定义感兴趣的类 (Inner) 的 Scala 代码示例:

package mypackage;

object Outer {
  object Middle {
    class Inner {
      def msg() {
        println("Running");
      }
    }
  }
}

要在 Java 代码中使用 Inner 类,我使用以下代码:

mypackage.Outer$Middle$Inner inner = new mypackage.Outer$Middle$Inner();
inner.msg();

但是,Eclipse (Indigo) 编译器在第一行显示以下消息:

嵌套类型 mypackage.Outer$Middle$Inner 无法使用其二进制名称引用

有趣的是,上面的 Java 代码在与 NetBeans 6.9.1 一起使用时可以工作。

这是 Eclipse 编译器的问题吗?是否有任何标志允许使用二进制名称?或者,这是 Scala 的问题还是我使用它的方式?

【问题讨论】:

    标签: java scala eclipse-jdt scala-java-interop


    【解决方案1】:

    无法从 Java 访问深度嵌套的对象。既不来自 Eclipse,也不来自命令行或任何构建工具。字节码翻译丢失了嵌套信息。

    Eclipse 不允许你使用$ 名称,所以它会报错。如果您关心 Java 互操作,则应该在边界处坚持使用类似 Java 的 Scala。顶级类,纯特征或抽象类,没有高阶方法等。

    【讨论】:

    • 那么,Netbeans 成功运行代码这一事实只是他们的幸运例外吗?
    • 如果确实如此,我会感到非常惊讶。 Netbeans 中的语法是什么?
    • 正是问题中描述的语法。我构建了一个 Scala jar 并在 NetBeans Java 项目中使用它。我在 GitHub 上添加了一个可执行示例:github.com/andriusvelykis/scala-nested-class-netbeans
    • @IulianDragos 这不是我第一次看到 NetBeans 接受 Eclipse 不接受的东西。 Eclipse 使用自己的增量编译器,因此它只能在安装 JRE 而不安装 JDK 的情况下运行。另一方面,NetBeans 期望 JDK 可用并使用那里提供的编译器。如果我在这个问题上错了,请纠正我。无论如何,Eclipse 编译器的行为可能与常规 javac 不同。这可能是错误的,或者更严格地遵守规范。如果您使用 Ant 或 Maven 使用单独的 JDK 进行构建,很有可能它会起作用。
    猜你喜欢
    • 2012-03-02
    • 2018-10-28
    • 2015-08-28
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多