? extends Eと?super Eの区別と使用

2392 ワード

と区別と使用
まずコードを見て、このようなクラスの継承関係を定義します.
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>を使用する必要があります.
』』ブロガーは長期にわたって学習心得を更新し、「いいね」をお勧めします.もし间违いがあれば、コメントエリアにメッセージを残してください.ありがとうございます!!