ホームページ  >  記事  >  Java  >  Java の汎用ワイルドカード extend および super

Java の汎用ワイルドカード extend および super

高洛峰
高洛峰オリジナル
2016-12-19 15:57:301406ブラウズ

Java ジェネリック

キーワードの説明

? ワイルドカード型

であることを示します。型の下限 (Java コアではスーパータイプ修飾と呼ばれます)。Object

が拡張されるまで、パラメータ化された型がこの型のスーパータイプ (親型) であることを示します。 例

静的クラス Food{}

静的クラス Fruit extends Food{}

静的クラス Apple extends Fruit{}
静的クラス RedApple extends Apple{}

List<> flist = new ArrayList();
// complie error:
// flist.add( ) );
// flist.add(new Fruit());
// flist.add(new Object());
flist.add(null); // null に対してのみ機能します



List は、「Fruit から継承された任意の型を持つリスト」を意味します。コンパイラは List が保持する型を判断できないため、リストにオブジェクトを安全に追加できません。 null は任意の型を表すことができるため、null を追加できます。したがって、List の add メソッドは意味のある要素を追加できませんが、既存のサブタイプ List からの割り当てを受け入れることができます。

Fruit Fruit = flist.get(0);

Apple apple = (Apple)flist.get(0);



配置はFruitを継承した型なので、Fruit型は安全に取り出せます。

flist.contains(new Fruit());

flist.contains(new Apple());



Collection で contains メソッドを使用する場合、ワイルドカードを使用せずに Object パラメーターの型を受け入れ、コンパイラーはそれを許可しますこのように呼んでください。

スーパーサンプル

List flist = new ArrayList();

flist.add(new Fruit());

flist.add(new RedApple());

// コンパイル エラー:
List flist = new ArrayList();


List の型は Fruit のスーパー型である可能性があるため、Fruit Apple の List のサブタイプに割り当てることはできません。

// コンパイル エラー:

Fruit item = flist.get(0) );


List の型は Fruit のいずれかのスーパー型である可能性があるため、コンパイラは get によって返されるオブジェクトの型が Fruit であるか、Fruit の親クラスである Food であるか、Object であるかを判断できません。 extends 戻り値の型の修飾には使用できますが、パラメーターの型の修飾には使用できません。
super はパラメータの型の修飾には使用できますが、戻り値の型の修飾には使用できません。

> スーパー スーパータイプ修飾を持つワイルドカードは汎用オブジェクトに書き込むことができ、拡張サブタイプ修飾を持つワイルドカードは汎用オブジェクトから読み取ることができます。




Java の汎用ワイルドカード extends と super に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。