JAva汎用タイプ消去
1115 ワード
汎用型はJDK 1.5で追加され、互換性を向上させるためにJVMを大きく変更しないため、汎用型はコンパイルと実行期間中にタイプが消去され、いくつかの問題が発生します.
配列の例:
このコードを見ると、String配列はObectタイプのオブジェクトを追加できないので、ランタイム配列の具体的なタイプは知っているので、ランタイムはエラーを報告し、コンパイル前にチェックするときはエラーを報告しません.
汎用集合を見てみましょう.
タイプ消去のため、実行中にoの具体的なタイプが分からないため、エラーを報告することができず、コンパイル前にタイムズエラーをチェックするしかありません.
JAvaでは完全なインバータ,コヒーレンスはなく,ListはListのサブタイプではなく,この問題を解決するためにワイルドカードの概念を導入した.
まとめ:
配列も集合も勝手に使えないのは、コンパイル前か実行時にエラーが発生した問題にほかならない.
配列の例:
String[] s = String[5];
Object[] o = s;
o.add(Object());
このコードを見ると、String配列はObectタイプのオブジェクトを追加できないので、ランタイム配列の具体的なタイプは知っているので、ランタイムはエラーを報告し、コンパイル前にチェックするときはエラーを報告しません.
汎用集合を見てみましょう.
List s = ArrayList<>();
List
タイプ消去のため、実行中に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
まとめ:
配列も集合も勝手に使えないのは、コンパイル前か実行時にエラーが発生した問題にほかならない.