泛型通配符extends與super的區別


<? extends T>限定參數類型的上界:參數類型必須是T或T的子類型

<? super T> 限定參數類型的下界:參數類型必須是T或T的超類型

總結為:

  1. <? extends T> 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界為T,T和T的父類都能接收,但是入參類型無法確定,只能接受null的傳入
  2. <? super T>只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收
  3. ? 既不能用於入參也不能用於返參

示例:

 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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM