JAva汎用タイプ消去

1115 ワード

汎用型はJDK 1.5で追加され、互換性を向上させるためにJVMを大きく変更しないため、汎用型はコンパイルと実行期間中にタイプが消去され、いくつかの問題が発生します.
配列の例:
String[] s = String[5];
Object[] o = s;
o.add(Object());

このコードを見ると、String配列はObectタイプのオブジェクトを追加できないので、ランタイム配列の具体的なタイプは知っているので、ランタイムはエラーを報告し、コンパイル前にチェックするときはエラーを報告しません.
汎用集合を見てみましょう.
List s = ArrayList<>();
List o = s;
o.add(Object());

タイプ消去のため、実行中にoの具体的なタイプが分からないため、エラーを報告することができず、コンパイル前にタイムズエラーをチェックするしかありません.
JAvaでは完全なインバータ,コヒーレンスはなく,ListはListのサブタイプではなく,この問題を解決するためにワイルドカードの概念を導入した.
extends  get,  set:

List s = ArrayList<>();

Object f(List extends Object> o) {
    o.add("ss"); //        ,  o        ,    Object     ,    String,    string   。
    return o.get(0); //Object  
}

f(s);


super  set,  get:

List o = ArrayList<>();

void f(List super String> s) {
    s.add("ss"); //  。
    s.get(0); //   
    String temp = s.get(0); //         ,    
}

f(s);


まとめ:
配列も集合も勝手に使えないのは、コンパイル前か実行時にエラーが発生した問題にほかならない.