Pri*_*osK 3 java scala scala-java-interop
来自Scala 编程语言概述,第二版:
// Scala
object PrintOptions {
def main(args: Array[String]): Unit = {
System.out.println("Options selected:")
for (val arg <- args)
if (arg.startsWith("-"))
System.out.println(" " + arg.substring(1))
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,Scala 程序调用方法
startsWith和substringofString,它是在 Java 中定义的一个类。它还访问outJava 类的静态字段System,并调用其(重载)println方法。即使 Scala 没有静态类成员的概念,这也是可能的。事实上,每个 Java 类在 Scala 中都被视为两个实体,一个包含所有动态成员的类和一个包含所有静态成员的单例对象。
我理解将 Scala 的伴随对象转换为 Java 字节码,但我不确定对于相反的示例(从 Java 到 Scala),上块引用中的粗体文本“在 Scala 中看到”究竟是什么意思。
这是否意味着具有静态成员的 Java 类在 Scala 中实际上被转换或解释为两个实体?或者我的两个假设都是错误的?
我认为您可能会被 Java 假设蒙蔽了双眼。考虑这个简单的代码片段:
X.Y()
Run Code Online (Sandbox Code Playgroud)
这意味着该方法Y正在对象上调用X,或者在X隐式转换为的其他对象上调用。
也许这看起来并不令人惊讶,或者您没有发现任何问题,所以让我们明确说明一个结果:X永远不会是一个类。您不要在类上调用方法,期间。
自然,这在静态成员方面与 Java 存在严重的互操作性问题,这就是为什么声明 Java 类的静态成员X将被“视为”单例对象的原因:因为否则,您将永远无法使用它们.
请注意,Scala 的单例对象是真正的对象——它们是单例类的实例。但是,具有静态成员的 Java 类不会为单个对象提供来源。在实践中,这意味着这一行:
val x = X
Run Code Online (Sandbox Code Playgroud)
如果X是 Scala 单例对象,则将起作用,但如果它是具有静态成员的 Java 类,则不起作用。
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |