Java静态类成员和Scala互操作性

时间:2012-03-28 11:02:00

标签: java scala scala-java-interop

来自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中的两个实体?或者我的两个假设都错了?

2 个答案:

答案 0 :(得分:4)

我认为你可能会被Java假设所蒙蔽。考虑一下这段简单的代码:

X.Y()

表示在对象YX隐式转换为的其他对象上调用方法X

也许这看起来并不令人惊讶,或者你没有看到任何不妥之处,所以让我们明确说明一个结果: X将从不成为一个类。你不要在类上调用方法,句点。

当然,这与Java有关静态成员的严重互操作性问题,这就是为什么声明Java类X的静态成员将被“看作”为单个对象的原因:因为,否则,你永远不能使用它们。

请注意,Scala的单例对象是真实对象 - 它们是单例类的实例。但是,具有静态成员的Java类不会将原点赋予单个对象。在实践中,这意味着这一行:

val x = X
如果X是Scala单例对象,

将起作用,但如果它是具有静态成员的Java类,则不起作用。

答案 1 :(得分:1)

它只是意味着scala不会对初始java代码进行任何更改,其中静态成员和非静态成员属于同一个类。

因此,你的第二个假设是正确的,第一个假设是假的。

我想这本书使用而不是解释,因为如果您考虑&#34;解释语言&#34;这最后一个可能有不同的含义。 (在这种情况下毫无意义)。