object ScalaTrueRing {
def rule = println("To rule them all")
}
この作品は、私はそれを逆コンパイル場合は、同等のJavaコードは次のようになり、Javaバイトコードにコンパイルされます。Scalaコンパニオンオブジェクトが2つのクラス(Javaと.NETの両方のコンパイラ)にコンパイルされるのはなぜですか?コードの
public final class JavaTrueRing
{
public static final void rule()
{
ScalaTrueRing..MODULE$.rule();
}
}
/* */ public final class JavaTrueRing$
/* */ implements ScalaObject
/* */ {
/* */ public static final MODULE$;
/* */
/* */ static
/* */ {
/* */ new();
/* */ }
/* */
/* */ public void rule()
/* */ {
/* 11 */ Predef..MODULE$.println("To rule them all");
/* */ }
/* */
/* */ private JavaTrueRing$()
/* */ {
/* 10 */ MODULE$ = this;
/* */ }
/* */ }
私はスカラ座を使用している場合、それは二つのクラスにコンパイルされ、そしてです.NETコンパイラは、MSILコードにコンパイルされます、と同等のC#のコードは、このようなものです:
public sealed class ScalaTrueRing
{
public static void rule()
{
ScalaTrueRing$.MODULE$.rule();
}
}
[Symtab]
public sealed class ScalaTrueRing$ : ScalaObject
{
public static ScalaTrueRing$ MODULE$;
public override void rule()
{
Predef$.MODULE$.println("To rule them all");
}
private ScalaTrueRing$()
{
ScalaTrueRing$.MODULE$ = this;
}
static ScalaTrueRing$()
{
new ScalaTrueRing$();
}
}
また二つのクラスにコンパイルされています。
なぜScalaコンパイラ(Java用と.NET用)がこれを行うのですか? 静的ルールメソッドでprintlnメソッドを呼び出すのはなぜですか?
JavaTrueRing $はどのクラスから来ていますか? –
@エリート紳士それは本当の名前はScalaTrueRing $です、私は明示的にそれがJavaコードであることを示すために名前を変更しました。私はクラスファイルを逆コンパイルして取得しました。 – CuiPengFei