java - Scala 编译器在什么 [Java/Scala?] 代码中重写原始 Scala 代码,如何才能看到

  显示原文与译文双语对照的内容

在 Scala 邮件列表中,不同的人经常说: "编译器将这里 [scala] 代码改写为此 [java/scala??] 代码"。 例如从一个最新的线程中,如果 Scala 看到


class C(i: Int = 4) {.. . }

然后编译器将它的重写为( 有效):


class C(i: Int) {.. . }
object C {
 def init$default$1: Int = 4
}

如何查明代码的编译器输出? 我应该对生成的字节码进行反编译?

时间: 原作者:

你可以使用"-print"作为编译器选项,而scalac将删除所有Scala-specific特性。

例如下面是原始代码:


class Main
{
 def test (x: Any) = x match {
 case"Hello" => println ("Hello World")
 case e: String => println ("String")
 case i: Int => println ("Int")
 case _ => println ("Something else")
 }
}

如果你使用"scalac -print"编译它,你将得到以下 Scala 代码。


[[syntax trees at end of cleanup]]//Scala source: Test.scala
package <empty> {
 class Main extends java.lang.Object with ScalaObject {
 def test(x: java.lang.Object): Unit = {
 <synthetic> val temp1: java.lang.Object = x;
 if (temp1.==("Hello"))
 {
 scala.this.Predef.println("Hello World")
 }
 else
 if (temp1.$isInstanceOf[java.lang.String]())
 {
 scala.this.Predef.println("String")
 }
 else
 if (temp1.$isInstanceOf[Int]())
 {
 scala.this.Predef.println("Int")
 }
 else
 {
 scala.this.Predef.println("Something else")
 }
 };
 def this(): Main = {
 Main.super.this();
 ()
 }
 }
}

原作者:

你可以查看生成的字节码


javap -c -private ClassNameWithoutDotClass

原作者:
...