ジェネリックコレクションのデコンパイル結果

今更なネタだけど気にしなーい。あくまで自分のため。

Javaがバージョン5になってから(2004年)追加された機能で、ジェネリックプログラミング機能というのがあるのだけれど、これらを実装してコンパイルしたコードを、Eclipseデコンパイルプラグインであるjadclipseで除いてみたら面白かったので書いてみる。
※なぜかjar化してから*.classファイルを開かないとデコンパイルできないんだけどなぜだろう?

まずはコンパイル前のコードMain.java。MyClassクラスはMain.javaの中に記述。

import java.util.ArrayList;
import java.util.List;


public class Main {

	public static void main(String[] args) {
		List<MyClass> list = new ArrayList<MyClass>();
		list.add(new MyClass());
		list.get(0).method();
	}
}

class MyClass{
	void method() {}
}

以下がコンパイルされたコードをjadclipseでデコンパイルした後のコードMain.classとMyClass.class。
ちなみにMyClassクラスはMain.javaファイルから切り離されて、Main.classと同一パッケージ内にMyClass.classとして分離されて出来た(これもなかなか面白いネタ!)。よくみると引数なし処理なしのコンストラクタも追加されてたり細かい違いが。

Main.classのほう。

/*jadclipse*/// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.

import java.util.*;

public class Main
{

    public Main()
    {
    }

    public static void main(String args[])
    {
        List list = new ArrayList();
        list.add(new MyClass());
        ((MyClass)list.get(0)).method();

    }
}


/*
	DECOMPILATION REPORT

	Decompiled from: xxx
	Total time: xx ms
	Jad reported messages/errors:
	Exit status: 0
	Caught exceptions:
*/

MyClass.classのほう。MyClassクラスは、定義した時点でパッケージアクセスだったので、クラス宣言のところに修飾子がついていない。

/*jadclipse*/// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) radix(10) lradix(10) 
// Source File Name:   Main.java

class MyClass extends Super
{

    MyClass()
    {
    }

    void method()
    {
    }

}


/*
	DECOMPILATION REPORT

	Decompiled from: xxx
	Total time: xx ms
	Jad reported messages/errors:
	Exit status: 0
	Caught exceptions:
*/

活目すべきは、コンパイル前にList型の型パラメータとしてを記述したところが、ListからMyClassを取り出すときのキャスト(MyClass)list.get(0)に使われている点。

こういうネタは、実際にはなんの役にも立たないけど、知ってると得した気分になるのはなぜなんだろう。