我最近开始学习Scala,并尝试在Java中使用我的Scala代码。导入的jar文件可以工作并包含我的类和方法;然而,当我发现在可用的导入类中,我可以同时访问 DiceRoller 和 DiceRoller $ 时,我有点惊讶,而且我也可以使用正常类中的 attribute_ $ eq 。
DiceRoller在Scala中被定义为 object ,其余类被定义为 class ,如果这可能会对此事有所了解。
我也知道匿名类和函数的基本理论,以及Scala如何考虑" =="等操作。功能,所以这不是我的观点,即使它可以是相关的。
当我导入Java包时,这些类和方法无法访问。 那么,为什么我在导入Scala jar文件时可以调用它们?我可以将这些匿名类和方法声明为私有吗?
答案 0 :(得分:9)
JVM对Scala一无所知。 Scala编译器必须以某种方式将Scala结构映射到JVM结构。
例如,JVM没有对象,因此Scala编译器将对象映射到具有单例实例的类。
JVM也没有特征,因此必须将它们映射到类。 (实际上,特征的映射相当复杂,实际上,特征被映射到多个类。)
在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工具根本不了解它们。