
泛型中上界與下界的定義
#上界 extend Fruit>
下界< ? super Apple>
上界與下界的特點
#上界的list只能get,不能add(確切地說不能add出除null之外的對象,包括Object)
下界的list只能add,不能get
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的時候,要add什麼類型,誰也不知道。但get的時候,不管是什麼子類,不管追溯多少輩,肯定有個父類是Fruit,所以,我都可以用最大的父類Fruit接著,也就是把所有的子類向上轉型為Fruit。
下界 super Apple>,表示Apple的所有父類,包括Fruit,一直可以追溯到老祖宗Object 。那麼當我add的時候,我不能add Apple的父類,因為不能確定List裡面存放的到底是哪個父類。但是我可以add Apple及其子類別。因為不管我的子類別是什麼類型,它都可以向上轉型為Apple及其所有的父類別甚至轉型為Object 。但是當我get的時候,Apple的父類別這麼多,我用什麼接著呢,除了Object,其他的都接不住。
所以,歸根結底可以用一句話表示,那就是編譯器可以支援向上轉型,但不支援向下轉型。具體來講,我可以把Apple物件賦值給Fruit的引用,但如果把Fruit物件賦值給Apple的引用就必須得用cast
以上是java泛型中的上界(extend)和下界(super)的詳細內容。更多資訊請關注PHP中文網其他相關文章!