object ScalaTrueRing {
def rule = println("To rule them all")
}
questo pezzo di codice saranno raccolte in codice Java byte, se mi decompilare, allora il codice Java equivalente è simile a questo:Perché un oggetto compagno Scala è compilato in due classi (sia compilatori Java che .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;
/* */ }
/* */ }
è compilato in due classi, e se uso Scala .net compilatore, che sarà essere compilato in codice MSIL, e il codice C# equivalente è come questo:
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$();
}
}
e 'anche compilato in due classi.
Perché i compilatori Scala (quello per Java e quello per .NET) lo fanno? Perché non chiama semplicemente il metodo println nel metodo della regola statica?
Quindi, da dove viene la classe 'JavaTrueRing $'? –
@The Elite Gentleman il suo vero nome è ScalaTrueRing $, ho cambiato il nome per mostrare esplicitamente che si tratta di codice java. Ho decompilato il file di classe e l'ho capito. – CuiPengFei