天天看點

泛型限定符------extend和super

一、extends 和super 泛型限定符-上界不存下界

extends:表示泛型的上限

super:表示泛型的下界

具體運用解釋如下:

在add方法中,隻能加入對象的子類以其本身,而在使用extends表示泛型時,由于不知道其下界,是以不能使用add方法

在get方法中,隻能加入對象的父類和其本身,而在使用super表示泛型時,由于不知道其上界,是以不能使用get方法

class Super{
    }
    class Self extends Super{
    }
    class Son extends Self{
    }
 
    void test() {
        List<? extends Self> a = new ArrayList<>();//參數類型上界是Self
        a.add(new Son());//error 不能放入任何類型,因為編譯器隻知道a中應該放入Self的某個子類,但具體放哪種子類它并不知道,是以,除了null以外,不能放入任何類型
        a.add(new Self());//error
        a.add(new Super());//error
        a.add(null);//error
        Self s1 = a.get(0); //傳回類型是确定的Self類,因為<? extends T> 隻能用于方法傳回,告訴編譯器此返參的類型的最小繼承邊界為T,T和T的父類都能接收,但是入參類型無法确定,隻能接受null的傳入
        Super s2 = a.get(0); //Self類型可以用Super接收
        Son s3 = a.get(0); //error:子類不能接收父類型參數
 
        //--------------------------------------
 
        List<? super Self> b = new ArrayList<>();//參數類型下界是Self
        b.add(new Son());//ok 隻能放入T類型,且滿足T類型的超類至少是Self,換句話說,就是隻能放入Self的子類型
        b.add(new Self());//ok 本身類型也可以
        b.add(new Super());//ERROR超類不可以
        b.add(null);//ok
        Object o1 = b.get(0);//傳回類型是未知的, 因為<? super T>隻能用于限定方法入參,告訴編譯器入參隻能是T或其子類型,而返參隻能用Object類接收
        Son o2 = b.get(0);//error
        Self o3 = b.get(0);//error
        Super o4 = b.get(0);//error