object ScalaTrueRing {
def rule = println("To rule them all")
}
este pedazo de código serán compilados en código de bytes de Java, si descompilarlo, a continuación, el código equivalente Java es similar a esto:¿Por qué un objeto complementario de Scala se compila en dos clases (compiladores Java y .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;
/* */ }
/* */ }
es compilado en dos clases, y si uso Scala .net compilador, que va a ser compilado en código MSIL, y el código C# equivalente es la siguiente:
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$();
}
}
también se recopiló en dos clases.
¿Por qué los compiladores Scala (el de Java y el de .NET) hacen esto? ¿Por qué no solo llama al método println en el método de regla estática?
Entonces, ¿de dónde viene la clase 'JavaTrueRing $'? –
@The Elite Gentleman su verdadero nombre es ScalaTrueRing $, cambié el nombre para mostrar explícitamente que es código Java. Descompilé el archivo de clase y lo obtuve. – CuiPengFei