object ScalaTrueRing {
def rule = println("To rule them all")
}
tego kawałka kodu zostaną skompilowane do kodu Java bajt, jeśli dekompilować go, a następnie odpowiednikiem kodu Java jest podobny do tego:Dlaczego obiekt towarzyszący Scala jest kompilowany w dwie klasy (zarówno kompilatory Java, jak i .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;
/* */ }
/* */ }
to skompilowane na dwie klasy, a jeśli mogę użyć Scala .net kompilator, to będzie kompilowany do kodu MSIL, a odpowiednikiem kodu C# jest tak:
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$();
}
}
jest również skompilowana na dwie klasy.
Dlaczego kompilatory Scala (ten dla Java i jeden dla .NET) to zrobić? Dlaczego po prostu nie wywołuje metody println w metodzie reguły statycznej?
Skąd pochodzi klasa 'JavaTrueRing $'? –
@The Elite Gentleman to prawdziwe imię ScalaTrueRing $, zmieniłem nazwę, aby wyraźnie pokazać, że jest to kod Java. Dekompilowałem plik klasy i dostałem to. – CuiPengFei