泛型中上界與下界的定義
#上界 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中文網其他相關文章!