? extends Eと?super Eの区別と使用
2392 ワード
と区別と使用
まずコードを見て、このようなクラスの継承関係を定義します.
一、限定集合要素の上境界タイプを表す
たとえば、次の集合です.
上のコードから,その集合に限定された要素はPersonクラスかそのサブクラスであることがわかる.
追加アクション:要素の追加は許可されていません
リストコレクションは要素を追加できません.なぜなら?extends Personはこのときリスト内の要素がPersonタイプであるか,Personと継承されたクラスであるかを限定しているだけで,具体的なタイプは与えられていない.
読み取り操作:上の境界で定義されたタイプを使用して受信します.
リストに要素が存在する場合、リストの要素を取り出すことができます.以下のようにします.
この場合,集合listの汎用型はPersonのタイプまたはそのサブクラスのみであり,その上境界クラスを用いて受信することができるからである.
二、限定集合要素の下境界タイプを表す
たとえば、次の集合です.
上のコードから分かるように,その集合に限定された要素はPersonクラスまたはその親クラスである.
追加アクション:Personクラスとそのサブクラスの追加を許可
このときlistコレクションはPersonクラスとそのサブクラスの追加を許可します.なぜなら?super Personはこのときリスト内の要素がPersonタイプまたはPersonクラスの親であることを限定しているだけで、personクラスの親を追加すると失敗する.Personクラスの親は多いかもしれないので、親のタイプを確実にすることはできない.逆に、Personクラスの子を追加することは可能である.子クラスは親タイプに上へ転換できるからだ.
読み込み操作:強制タイプ変換が必要
リストに要素が存在する場合、リストの要素を取り出すことができます.以下のようにします.
この場合,集合listの汎用型はPersonの型か親でしかないため,強転を行わなければならない.
三、和の使用
アクセスの原則
根拠は?extends Eと?super Eワイルドカードの特徴は、以下の結論を得ることができます.
PECS
PECSとは「Producer Extends,Consumer Super」のこと.collectionを巡回し、各要素を操作したい場合は、このセットが生産者(生産要素)である場合は、Collection extends Thing>を使用します.要素をcollectionに追加したい場合は、コレクションは消費者(消費要素)がCollection super Thing>を使用する必要があります.
』』ブロガーは長期にわたって学習心得を更新し、「いいね」をお勧めします.もし间违いがあれば、コメントエリアにメッセージを残してください.ありがとうございます!!
まずコードを見て、このようなクラスの継承関係を定義します.
class World { }
class Person extends World { }
class Teacher extends Person { }
一、限定集合要素の上境界タイプを表す
たとえば、次の集合です.
ArrayList extends Person> list = new ArrayList<>();
list = new ArrayList(); //
list = new ArrayList(); //
list = new ArrayList(); //
上のコードから,その集合に限定された要素はPersonクラスかそのサブクラスであることがわかる.
追加アクション:要素の追加は許可されていません
list.add(new World()); //
list.add(new Person()); //
list.add(new Teacher()); //
リストコレクションは要素を追加できません.なぜなら?extends Personはこのときリスト内の要素がPersonタイプであるか,Personと継承されたクラスであるかを限定しているだけで,具体的なタイプは与えられていない.
読み取り操作:上の境界で定義されたタイプを使用して受信します.
リストに要素が存在する場合、リストの要素を取り出すことができます.以下のようにします.
Person person = list.get(0);
この場合,集合listの汎用型はPersonのタイプまたはそのサブクラスのみであり,その上境界クラスを用いて受信することができるからである.
二、限定集合要素の下境界タイプを表す
たとえば、次の集合です.
ArrayList super Person> list = new ArrayList<>();
list = new ArrayList(); //
list = new ArrayList(); //
list = new ArrayList(); //
上のコードから分かるように,その集合に限定された要素はPersonクラスまたはその親クラスである.
追加アクション:Personクラスとそのサブクラスの追加を許可
list.add(new World()); //
list.add(new Person()); //
list.add(new Teacher()); //
このときlistコレクションはPersonクラスとそのサブクラスの追加を許可します.なぜなら?super Personはこのときリスト内の要素がPersonタイプまたはPersonクラスの親であることを限定しているだけで、personクラスの親を追加すると失敗する.Personクラスの親は多いかもしれないので、親のタイプを確実にすることはできない.逆に、Personクラスの子を追加することは可能である.子クラスは親タイプに上へ転換できるからだ.
読み込み操作:強制タイプ変換が必要
リストに要素が存在する場合、リストの要素を取り出すことができます.以下のようにします.
World world = (World) list.get(0);
この場合,集合listの汎用型はPersonの型か親でしかないため,強転を行わなければならない.
三、和の使用
アクセスの原則
根拠は?extends Eと?super Eワイルドカードの特徴は、以下の結論を得ることができます.
, ? extends
, ? super
, , 。
PECS
PECSとは「Producer Extends,Consumer Super」のこと.collectionを巡回し、各要素を操作したい場合は、このセットが生産者(生産要素)である場合は、Collection extends Thing>を使用します.要素をcollectionに追加したい場合は、コレクションは消費者(消費要素)がCollection super Thing>を使用する必要があります.
』』ブロガーは長期にわたって学習心得を更新し、「いいね」をお勧めします.もし间违いがあれば、コメントエリアにメッセージを残してください.ありがとうございます!!