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