ScalaとJavaの比較

Scalaで書いてコンパイルしたクラスをjavaにdecompileしたら面白かったのでメモ

まずはScala...

class test {
  def main = { Console println "Hello World" }
}

でこいつをscalacでコンパイルしてからjavaに戻すと...

import java.rmi.RemoteException;
import scala.Console$;
import scala.ScalaObject;

public class test
    implements ScalaObject
{

    public test()
    {
    }

    public void main()
    {
        Console$.MODULE$.println("Hello World");
    }

    public int $tag()
        throws RemoteException
    {
        return scala.ScalaObject.class.$tag(this);
    }
}

なるほどなるほど~

ではこれは

object test {
  def main = { Console println "Hello World" }
}

2つクラスができます。。

test$.class

import java.rmi.RemoteException;
import scala.Console$;
import scala.ScalaObject;

public final class test$
    implements ScalaObject
{   
        
    public test$()
    {
    }
        
    public void main()
    {   
        Console$.MODULE$.println("Hello World");
    }

    public int $tag()
        throws RemoteException
    {
        return scala.ScalaObject.class.$tag(this);
    }

    public static final test$ MODULE$ = this;

    static
    {
        new test$();
    }
}

test.class

import java.rmi.RemoteException;

public final class test
{

    public static final void main()
    {
        test$.MODULE$.main();
    }

    public static final int $tag()
        throws RemoteException
    {
        return test$.MODULE$.$tag();
    }
}

objectにするとインスタンスがstaticに保持されるので1つしかできないみたいだ。