Java ジェネリック
キーワードの説明
? ワイルドカード型
パラメータ化された型が T または super T> であることを示します。型の下限 (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 extends Frut> は、「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.add(new RedApple());
// コンパイル エラー:
List
List の型は Fruit のスーパー型である可能性があるため、Fruit Apple の List
Fruit item = flist.get(0) );
List super Fruit> の型は Fruit のいずれかのスーパー型である可能性があるため、コンパイラは get によって返されるオブジェクトの型が Fruit であるか、Fruit の親クラスである Food であるか、Object であるかを判断できません。 extends 戻り値の型の修飾には使用できますが、パラメーターの型の修飾には使用できません。
super はパラメータの型の修飾には使用できますが、戻り値の型の修飾には使用できません。