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