java? extends E和? super E 的區別
阿新 • • 發佈:2019-01-04
java中<? extends E>和<? super E> 的區別
import java.util.ArrayList; public class Do1 { /* * Q:探究<? extends E>和<? super E>的使用和意義區別 * 通過預編譯報錯區別兩者的使用區別 * */ public static void main(String[] args) { /* * <? extends person>使用時,person本身和他的子類(子類的子類)都沒有報錯 * */ ArrayList<? extends Person> al1 = new ArrayList<Person>(); ArrayList<? extends Person> al2 = new ArrayList<Man>(); ArrayList<? extends Person> al3 = new ArrayList<Woman>(); ArrayList<? extends Person> a14 = new ArrayList<ManBoy>(); /* * <? super person>使用時,除了person本身沒有報錯外,其他都報錯 * */ ArrayList<? super Person> b11 = new ArrayList<Person>(); ArrayList<? super Person> b12 = new ArrayList<Man>(); //報錯 ArrayList<? super Person> b13 = new ArrayList<Woman>(); //報錯 ArrayList<? super Person> b14 = new ArrayList<ManBoy>(); //報錯 /* * <? extends man>使用時,men本身和其子類沒有報錯,他的父類person和平行子類woman報錯 * */ ArrayList<? extends Man> cl1 = new ArrayList<Person>(); //報錯 ArrayList<? extends Man> cl2 = new ArrayList<Man>(); ArrayList<? extends Man> cl3 = new ArrayList<Woman>(); //報錯 ArrayList<? extends Man> c12 = new ArrayList<ManBoy>(); /* * <? super man>使用時,man本身和父類沒有報錯,子類menboy和平行子類woman報錯 * */ ArrayList<? super Man> d11 = new ArrayList<Person>(); ArrayList<? super Man> d12 = new ArrayList<Man>(); ArrayList<? super Man> d13 = new ArrayList<Woman>(); //報錯 ArrayList<? super Man> d14 = new ArrayList<ManBoy>(); //報錯 //通過上面的例子可以判斷出 //<? extends E>為泛型固定上界,當後面的例項型別是本身和子類(子類的子類)都是不會報錯的 //<? super E>為泛型固定下界,當後面的例項型別是本身和其父類時不報錯 /* * 證明:通過<? extends woman>本身和子類不報錯 **/ ArrayList<? extends Woman> el3 = new ArrayList<Woman>(); ArrayList<? extends Woman> e12 = new ArrayList<WomanGirl>(); /* * 證明:通過<? super woman>本身和父類不報錯 * */ ArrayList<? super Woman> f13 = new ArrayList<Person>(); ArrayList<? super Woman> f14 = new ArrayList<Woman>(); } } class Person{ } class Man extends Person{ } class ManBoy extends Man{ } class Woman extends Person{ } class WomanGirl extends Woman{ }
在上面的例子中,建立了Person類和子類Man類、Woman類。兩個子類各自又擴充套件了兩個子類。通過例項報錯驗證使用方法。
具體的使用意義的差別是
- <? extends E> 泛型固定上界接受本類和子類
- 在集合框架中,想要將子類集合的東西addAll()進父類集合中。父類集合名.addAll(子類集合名)
- 直接對父類集合經行擴容,將父類引用指向子類例項。此為父類引用指向子類的父類集合實現
- <? super E> 泛型固定下界——接受本類和父類
- 可雙列集合(map)中,進行比較器(Comparator)的程式碼重用,提高效率
- 比較器(Comparator)使用父類型別編寫,這樣子類也可以向上轉型使用。此為父類引用指向子類在比較器中的實現
補充:
java中的泛型一共有是三種
- ArrayList<T> al=new ArrayList<T>(); 指定集合元素只能是T型別
- ArrayList<?> al=new ArrayList<?>(); 集合元素可以是任意型別,這種沒有意義,一般是方法中,只是為了說明用法
- 編譯1:報錯:ArrayList<? extends E> al=new ArrayList<? extends E>();
- 編譯2:報錯:ArrayList<?> al=new ArrayList<?>();
- 編譯3:成功:ArrayList<?> al=new ArrayList<String>();
- 泛型的限定:
- <? extends E>:接收E型別或者E的子型別。
- <?super E>: 接收E型別或者E的父型別。