3

An Overview of the Scala Programming Language, Second Edition から:

// 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 プログラムはJava で定義されたクラスであるメソッドstartsWith およびsubstringof を呼び出します。Stringまたout、Java クラスの static フィールドにアクセスし、その (オーバーロードされた)メソッドSystemを呼び出します。printlnこれは、Scala に静的クラス メンバーの概念がない場合でも可能です。実際、すべての Java クラスは Scalaでは 2 つのエンティティとして認識されます。すべての動的メンバーを含むクラスと、すべての静的メンバーを含むシングルトン オブジェクトです。

Scala のコンパニオン オブジェクトを Java バイトコードに変換することは理解していますが、反対の例 (Java から Scala へ)の上部ブロック引用符 " is seen in Scala " の太字テキストが正確に何を意味するのかはわかりません。

静的メンバーを持つ Java クラスが実際に変換されたり、Scala の 2 つのエンティティとして解釈されたりするということですか? それとも私の仮定の両方が間違っていますか?

4

2 に答える 2

5

私はあなたがJavaの仮定に目がくらんでいるかもしれないと思います。この単純なコードスニペットを考えてみましょう。

X.Y()

これは、メソッドがオブジェクト、または暗黙的に変換された他のオブジェクトでY呼び出されていることを意味します。XX

おそらくそれは驚くべきことではないように見えるか、それで何も悪いことは見られないので、結果を明示的に述べましょう:Xは決してクラスにはなりません。クラス、期間でメソッドを呼び出さないでください。

当然、これは静的メンバーに関してJavaとの深刻な相互運用性の問題をX引き起こします。そのため、Javaクラスの静的メンバーはシングルトンオブジェクトとして「認識」されると言われています。そうしないと、静的メンバーを使用できなくなるためです。 。

Scalaのシングルトンオブジェクトは真のオブジェクトであることに注意してください。これらはシングルトンクラスのインスタンスです。ただし、静的メンバーを持つJavaクラスは、単一のオブジェクトにオリジンを与えません。実際には、これは次の行を意味します。

val x = X

がScalaシングルトンオブジェクトの場合Xは機能しますが、静的メンバーを持つJavaクラスの場合は機能しません。

于 2012-03-28T15:03:06.540 に答える
1

これは単に、静的メンバーと非静的メンバーが同じクラスにある最初の Java コードに対して、scala が何も変更しないことを意味します。

したがって、2 番目の仮定は true で、最初の仮定は false です。

「解釈された言語」(その文脈では意味がない)について考えると、この最後のものは異なる意味を持つ可能性があるため、この本は解釈されたのではなく見られたと思います。

于 2012-03-28T11:31:56.020 に答える