Java でのジェネリックスの使用法の概要

高洛峰
リリース: 2017-01-18 11:19:58
オリジナル
1372 人が閲覧しました

この記事の例は、Java でのジェネリックスの使用法を要約しています。皆さんの参考に共有してください。詳細は次のとおりです。

1

public interface List<E> {
 void add(E);
 Iterator<E> iterator();
}
ログイン後にコピー
の基本的な使い方

2 ジェネリックとサブクラス

ChildはParentのサブクラスですが、ListはListのサブクラスではありません。
つまり、 List list = new ArrayList() は間違っています。
上記が正しい場合:

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 サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!