JAVA泛型的? extends和? super的比較

在JDK1.5以後能夠使用泛型,一般能夠在下面的地方使用.
A,泛型類聲明,如public class GeneralT<A>
B,泛型接口聲明,如public interface GenIntf<A>
C,泛型方法聲明,如
public <T extends BaseCls> void thisIsT(List<T> list, T e) {
    list.add(e);
}
D,泛型構造器(constructor)聲明,如 GeneralT<BaseCls> pgt = new GeneralT<BaseCls>();函數

在這裏主要介紹一下? extends和? super的區別.
1,? extends叫作向上造型.
ArrayList<? extends BaseCls> list1 = new ArrayList<BaseCls>();
意味着這個list1裏面放的都是BaseClse的子類,保證你能夠經過list.get(index)
獲得的類都是BaseCls或者BaseCls的子類.
BaseCls cls = list1.get(0);//合法的
list1.add(new BaseCls());或者list1.add(new CldCls());都是不合法的.
這裏面是不能經過add函數放東西進去的,那這樣有什麼用呢.
通常來說,定義成? extends BaseCls的參數一般只能用來從裏面取數據.
以下downbound方法能夠接受? extends BaseCls類型的list
public void downbound(List<? extends BaseCls> list) {   
    for(BaseCls cls:list){
        cls.func();
    }       
}
ArrayList<BaseCls> list1 = new ArrayList<BaseCls>();
ArrayList<CldCls> list2 = new ArrayList<CldCls>();
downbound(list1);和downbound(list2);都是合法的.this

2,? super BaseCls叫作向下造型.
ArrayList<? super BaseCls> list2 = new ArrayList<BaseCls>();
意味着這個list2裏面只能放BaseClse或者它的子類.
list2.add(new BaseCls());或者list2.add(new CldCls());都是合法的.
list2.get(index)返回的是Object類型,由於不知道是那個具體類.
限制了放進去的對象的類型,爲何取的時候不是BaseCls呢,這裏不理解...
public void upperbound(List<? super BaseCls> list) {
    list.add(new BaseCls()
    list.add(new CldCls());
}對象

相關文章
相關標籤/搜索