<? extends T>限定參數類型的上界:參數類型必須是T或T的子類型
<? super T> 限定參數類型的下界:參數類型必須是T或T的超類型
總結為:
- <? extends T> 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界為T,T和T的父類都能接收,但是入參類型無法確定,只能接受null的傳入
- <? super T>只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收
- ? 既不能用於入參也不能用於返參
示例:
1 class Super{ 2 } 3 class Self extends Super{ 4 } 5 class Son extends Self{ 6 } 7 8 void test() { 9 List<? extends Self> a = new ArrayList<>();//參數類型上界是Self 10 a.add(new Son());//error 不能放入任何類型,因為編譯器只知道a中應該放入Self的某個子類,但具體放哪種子類它並不知道,因此,除了null以外,不能放入任何類型 11 a.add(new Self());//error 12 a.add(new Super());//error 13 a.add(null);//error 14 Self s1 = a.get(0); //返回類型是確定的Self類,因為<? extends T> 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界為T,T和T的父類都能接收,但是入參類型無法確定,只能接受null的傳入 15 Super s2 = a.get(0); //Self類型可以用Super接收 16 Son s3 = a.get(0); //error:子類不能接收父類型參數 17 18 //-------------------------------------- 19 20 List<? super Self> b = new ArrayList<>();//參數類型下界是Self 21 b.add(new Son());//ok 只能放入T類型,且滿足T類型的超類至少是Self,換句話說,就是只能放入Self的子類型 22 b.add(new Self());//ok 本身類型也可以 23 b.add(new Super());//ok 超類不可以 24 b.add(null);//ok 25 Object o1 = b.get(0);//返回類型是未知的, 因為<? super T>只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收 26 Son o2 = b.get(0);//error 27 Self o3 = b.get(0);//error 28 Super o4 = b.get(0);//error 29 30 List<?> c = new ArrayList<>(); 31 //總結: 32 // 1. <? extends T> 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界為T,T和T的父類都能接收,但是入參類型無法確定,只能接受null的傳入 33 // 2. <? super T>只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收 34 // 3. ? 既不能用於入參也不能用於返參 35 }
