再論汎型
汎用は言語特性とは言えず、javaの汎用技術を実現する折衷であり、なぜ消去を選択したのかというと、後方互換性を保つためであると思います.汎用コードと非汎用コードを共存させることができる.後方互換性を維持するために、汎用ペアjvmは可視ではありません.つまり、jvmはコンパイル時期のタイプチェックの安全を提供することを主な目標としている以上、コンパイル時期に行うべき仕事が多いので、実際にはそうです.消去とは、実行時に汎用パラメータが見えないという原理であり、jvm実行汎用コードは、従来の通常コードのように実行される!(もちろん何も変更しなくても無理ですが、http://icyfenix.iteye.com/blog/1021949 ).
list<string > list = new arrarylist<string>();list.add(“cantellow”);int integer = list.get(0);//compile error
次に、パラメータ化タイプのタイプパラメータ(erasure>)を消去し、タイプ変数を上限(spanspan>)"置換は、通常、これらの上限はobjectである.ここでのタイプ変数とは、インスタンスドメイン、ローカルメソッドドメイン、メソッドパラメータ、およびメソッド戻り値においてタイプ情報をマークするために使用される変数 a elem;,メソッド宣言 node (a elem){};span>
list<integer> li = new arraylist<integer>(); list<number> ln = li; // illegal ln.add(new float(3.1415));
なぜなら lnは List
の詳細については、を参照してください.
http://www.iteye.com/topic/585900