泛型通配符extends與super的區別

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:子類不能接收父類型參數get

        //--------------------------------------編譯器

        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());//ok 超類不能夠
        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編譯

        List<?> c = new ArrayList<>();
        //總結:
        // 1. <? extends T> 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界爲T,T和T的父類都能接收,可是入參類型沒法肯定,只能接受null的傳入
        // 2. <? super T>只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收
        // 3. ? 既不能用於入參也不能用於返參
    }class

相關文章
相關標籤/搜索