ホームページ >Java >&#&チュートリアル >Javaジェネリックスの上限(拡張)と下限(スーパー)
ジェネリックにおける上限と下限の定義
上限 extend Fruit>
下限< ? super Apple>
上限と下限の特性
上限リストは取得のみ可能で、追加はできません (正確には、null 以外のものを追加することはできません) ) オブジェクト (Object を含む))
下限リストは追加のみ可能ですが、取得はできません
import java.util.ArrayList; import java.util.List; class Fruit {} class Apple extends Fruit {} class Jonathan extends Apple {} class Orange extends Fruit {} public class CovariantArrays { public static void main(String[] args) { //上界 List<? extends Fruit> flistTop = new ArrayList<Apple>(); flistTop.add(null); //add Fruit对象会报错 //flist.add(new Fruit()); Fruit fruit1 = flistTop.get(0); //下界 List<? super Apple> flistBottem = new ArrayList<Apple>(); flistBottem.add(new Apple()); flistBottem.add(new Jonathan()); //get Apple对象会报错 //Apple apple = flistBottem.get(0); } }
これらの特性の理由
上限< ;? extend Fruit> ; は、Fruit を継承するすべてのサブクラスを示しますが、どのサブクラスであるかは判断できないため、add を呼び出すときに、どの型を追加すればよいかわかりません。ただし、取得する場合、それがどのサブクラスであっても、何世代前に遡っても、Fruit という親クラスが存在する必要があるため、最大の親クラスである Fruit を使用して続行、つまりすべてのサブクラスを変換できます。フルーツに向かって上向きに。
下限 super Apple> は、Fruit を含む Apple のすべての親クラスが祖先オブジェクトまで遡ることができることを意味します。その後、追加するときに、リストにどの親クラスが格納されているかを判断できないため、Apple の親クラスを追加できません。ただし、Apple とそのサブクラスを追加することはできます。なぜなら、サブクラスがどのような型であっても、それを Apple とそのすべての親クラス、さらには Object に上向きに変換できるからです。しかし、実際に理解してみると、Apple の親クラスが多すぎて、何を使って進めればよいでしょうか? Object 以外は何もわかりません。
つまり、最終的には、これを一文で表すと、コンパイラは上方変換はサポートできるが、下方変換はサポートしないということになります。具体的には、Apple オブジェクトを Fruit への参照に割り当てることができますが、Fruit オブジェクトを Apple への参照に割り当てる場合は、cast
を使用する必要があります。以上がJavaジェネリックスの上限(拡張)と下限(スーパー)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。