【问题标题】:Importing Scala in Java: weird classes & methods showing在 Java 中导入 Scala:奇怪的类和方法显示
【发布时间】:2015-06-07 11:05:17
【问题描述】:

我最近开始学习 Scala,并尝试在 Java 中使用我的 Scala 代码。导入的 jar 文件可以工作并包含我的类和方法;但是,当我发现在可用于导入的类中,我可以同时访问 DiceRollerDiceRoller$ 时,我有点惊讶,而且我还可以访问诸如此类的方法作为普通类中的 attribute_$eq

DiceRoller 在 Scala 中被定义为 object,而其余的类则被定义为 class,如果这可能对此事有所启发的话。

我也知道匿名类和函数的基本理论,以及 Scala 如何考虑诸如“==”函数之类的操作,所以这不是我的意思,即使它可以相关。

当我导入 Java 包时,这些类和方法无法访问。 那么,为什么我在导入 Scala jar 文件时可以调用它们呢?我可以将这些匿名类和方法声明为私有吗?

【问题讨论】:

    标签: java scala


    【解决方案1】:

    JVM 对 Scala 一无所知。 Scala 编译器必须以某种方式将 Scala 构造映射到 JVM 构造。

    例如,JVM 没有对象,因此 Scala 编译器将对象映射到具有单例实例的类。

    JVM 也没有特征,因此必须将其映射到类。 (其实traits的映射是相当复杂的,实际上traits会映射到多个类。)

    在 Scala 中,字段可以被方法覆盖,而在 JVM 中则不能。因此,Scala 的字段必须映射到可以被方法覆盖的东西,也就是方法。

    还要注意,您的 Java IDE 对 Scala 如何将 Scala 构造编码为 JVM 构造一无所知。例如,JVM 对匿名类一无所知,因此 Java 编译器将匿名类编码为具有奇怪名称的常规命名类。 Java IDE 知道这些奇怪的名称并且不显示它们,但 Java IDE 不知道 Scala 编译器使用的名称。

    JVM 对函数一无所知。现在,Java 8 有了一流的功能,并且有 Java IDE 可以理解的标准化编码,但 Scala 在 Java 拥有一流功能之前就有了一流的功能,而且他们提出的编码与 Java 设计者的编码不同想出了。 (不过,这将在 Scala 的下一个版本中发生变化。)

    请注意,Clojure、Groovy、Python、Ruby、JavaScript、Fantom、Kotlin 和所有其他 JVM 语言也会发生同样的情况。 Java 工具根本不知道它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多