【J 2 SE】JAVA文法糖の-擬似汎用型

1403 ワード

JAVA文法糖の-偽汎型
汎用、すなわちパラメトリックタイプ
まず一般的な例を見てみましょう
 
	public static void main(String[] args) {
		List<String> strList = new ArrayList<String>();
		strList.add("generic test!");
		for (String str : strList) {
			System.out.println(str);
		}
	}

汎用消去後(classファイルを逆コンパイル可能)コード:
public static void main(String[] args)

  {

    List strList = new ArrayList();

    strList.add("generic test!");

    for (String str : strList)

      System.out.println(str);

  }

コンパイル後:汎用型が消え、汎用型が原生型に戻る
理由:1、JVMは汎用型という概念がなく、すべての汎用型がコンパイルされた後、すべて原生型に戻り、コンパイラは消去法で汎用型を実現する
消去規則:
汎用型の型変数が限定されていない場合()、元の型としてObjectを使用します.    限定があれば()では、XClassを元のタイプとして使用します.    複数の限定がある場合()では、最初の境界のタイプ変数XClass 1クラスを元のタイプとして使用します.
もたらすトラブル
1、汎用型を継承することによる多態面倒
コンパイラはブリッジメソッドを使用してマルチステートの競合を解決します.    JVMはパラメータタイプと戻りタイプでメソッドを決定します. コンパイラが何らかの方法で方法署名のような2つの方法を自分でコンパイルすると(コンパイラ自身がこのような奇跡を創造するしかないが、私たちのプログラマーはこのようなコードを人為的に書くことができない).JVMは、戻りタイプが異なることを前提として、これらの方法を明確にすることができます.
2、方法の衝突
3、汎用配列なし
まとめ:汎用コードとJVM    ① 仮想マシンには汎用型はなく、通常のクラスと方法しかありません.    ② コンパイルフェーズでは、すべての汎用クラスのタイプパラメータがObjectまたはそれらの限定境界に置き換えられます.(タイプ消去)    ③ 汎用タイプを継承する場合、ブリッジメソッドの合成は、タイプ変数の消去によるマルチステート災害を回避するために行われます.投稿:http://www.iteye.com/topic/549509