object ScalaTrueRing {
def rule = println("To rule them all")
}
dieses Stück Code in Java-Bytecode kompiliert werden, wenn ich es zu dekompilieren, dann das Äquivalent von Java-Code zu diesem ähnlich ist:Warum wird ein Begleitobjekt von Scala in zwei Klassen kompiliert (Java- und .NET-Compiler)?
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;
/* */ }
/* */ }
es in zwei Klassen kompiliert, und wenn ich Scala verwenden .net-Compiler, wird es in MSIL Code kompiliert werden, und der äquivalente C# -Code ist wie folgt:
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$();
}
}
es wird auch in zwei Klassen zusammengestellt.
Warum machen Scala Compiler (der für Java und der für .NET) das? Warum ruft es die println-Methode nicht nur in der statischen Regelmethode auf?
Woher kommt also die Klasse 'JavaTrueRing $'? –
@Der Elite Gentleman, es ist echter Name ist ScalaTrueRing $, ich änderte den Namen, um explizit zu zeigen, dass es Java-Code ist. Ich habe die Klassendatei dekompiliert und verstanden. – CuiPengFei