来自An 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))
}
}
在上面的示例中,Scala程序调用方法
startsWith
和substring
的{{1}},这是一个用Java定义的类。它 还访问Java类String
的静态out
字段,以及 调用其(重载)System
方法。这甚至是可能的 虽然Scala没有静态类成员的概念。事实上, 每个Java类在Scala中都可以看作作为两个实体,一个类 包含所有动态成员和包含所有动态成员的单个对象 静态成员。
我理解将Scala的伴随对象转换为Java字节码,但是我不确定它在上面的blockquote中是什么意思是粗体文本“在Scala中看到 ”用于相反的例子(从Java到Scala) )。
这是否意味着具有静态成员的Java类实际上已转换或仅被解释为Scala中的两个实体?或者我的两个假设都错了?
答案 0 :(得分:4)
我认为你可能会被Java假设所蒙蔽。考虑一下这段简单的代码:
X.Y()
表示在对象Y
或X
隐式转换为的其他对象上调用方法X
。
也许这看起来并不令人惊讶,或者你没有看到任何不妥之处,所以让我们明确说明一个结果: X将从不成为一个类。你不要在类上调用方法,句点。
当然,这与Java有关静态成员的严重互操作性问题,这就是为什么声明Java类X
的静态成员将被“看作”为单个对象的原因:因为,否则,你永远不能使用它们。
请注意,Scala的单例对象是真实对象 - 它们是单例类的实例。但是,具有静态成员的Java类不会将原点赋予单个对象。在实践中,这意味着这一行:
val x = X
如果X
是Scala单例对象,将起作用,但如果它是具有静态成员的Java类,则不起作用。
答案 1 :(得分:1)
它只是意味着scala不会对初始java代码进行任何更改,其中静态成员和非静态成员属于同一个类。
因此,你的第二个假设是正确的,第一个假设是假的。
我想这本书使用看而不是解释,因为如果您考虑&#34;解释语言&#34;这最后一个可能有不同的含义。 (在这种情况下毫无意义)。