object ScalaTrueRing {
def rule = println("To rule them all")
}
這一段代碼會被編譯成Java字節碼,如果我反編譯它,那麼相應的Java代碼與此類似:爲什麼Scala伴侶對象被編譯成兩個類(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 $'從哪裏來? –
@The Elite Gentleman它的真名是ScalaTrueRing $,我更改了名稱以明確表明它是java代碼。我反編譯了這個類文件並得到了。 – CuiPengFei