この記事の例は、Java でのジェネリックスの使用法を要約しています。皆さんの参考に共有してください。詳細は次のとおりです。
1
public interface List<E> { void add(E); Iterator<E> iterator(); }
2 ジェネリックとサブクラス
ChildはParentのサブクラスですが、List
つまり、 List
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 サイトに注目してください。