【发布时间】:2012-10-08 14:40:17
【问题描述】:
object ScalaTrueRing {
def rule = println("To rule them all")
}
这段代码会被编译成java字节码,如果我反编译,那么等效的java代码是这样的:
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;
/* */ }
/* */ }
它被编译成两个类,如果我使用Scala.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$这个类是从哪里来的呢? -
@精英绅士它的真名是ScalaTrueRing$,我更改了名称以明确表明它是java代码。我反编译了类文件并得到了它。
标签: java .net scala compiler-construction companion-object