この記事の例は、Java でのジェネリックスの使用法を要約しています。皆さんの参考に共有してください。詳細は次のとおりです。
1
public interface List<E> { void add(E); Iterator<E> iterator(); }の基本的な使い方
2 ジェネリックとサブクラス
ChildはParentのサブクラスですが、Listad7a74ca7e6896ff8ac9eb8e25d760c6はList294ec52526076f8c76b491d15e4edc9cのサブクラスではありません。
つまり、 Lista87fdacec66f0909fc0757c19f2d2b1d list = new ArrayListf7e83be87db5cd2d9a8a0b8117b38cd4() は間違っています。
上記が正しい場合:
List<String> ls = new ArrayList<String>(); //1 List<Object> lo = ls; //2 lo.add(new Object()); // 3 String s = ls.get(0); // 4,将object转换为string将失败。
3 ワイルドカード
理由 2 のため、次の実装はセットの出力を統合するために使用できません
void printCollection(Collection<Object> c) { for (Object o: c) { // do something } }
それで、ワイルドカードが必要ですか?:
void printCollection(Collection<?> c) { for (Object o: c) { // 1 // do something } } // ok
ここでの ? は型が不明であることを意味しますが、オブジェクトはすべて Object であるため、上記の例の 1 は正しいです。しかし、次の例は間違っています:
void add(Collection<? extends MyClass> c) { c.add(new MyClass()); // wrong } // ok
その理由も非常に明確で、? extends MyClass は型が MyClass のサブクラスであることを示していますが、具体的な型は不明です
4. 上記の例:
<T> add(Collection<T> c, T t) { c.add(t); }
として実装できます。コンパイラは、セマンティクスを確保しながら型変換を支援します。
5. ジェネリックランタイムの比較
List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getClass()); // true
ジェネリッククラスのランタイムは同じなので。
6 汎用配列 (型のセキュリティが確保されていない可能性があります)
List<String>[] lsa = new ArrayList<String>[10]; // error
可能であれば、型のセキュリティが確保されていない可能性があります。例:
Object o = lsa; Object []oa = (Object[])o; List<Integer> li = new ArrayList<Integer>(); li.add(new Integer(3)); oa[1] = li; String s = lsa[1].get(0); // runtime error
この記事が皆さんの Java プログラミングに役立つことを願っています。
Java でのジェネリックスの使用法の概要に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。