java? extends E和? super E 的區別

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>   泛型固定上界接受本類和子類
  1. 在集合框架中,想要將子類集合的東西addAll()進父類集合中。父類集合名.addAll(子類集合名)
  2. 直接對父類集合經行擴容,將父類引用指向子類實例。此爲父類引用指向子類的父類集合實現
  • <? super E>      泛型固定下界——接受本類和父類
  1. 可雙列集合(map)中,進行比較器(Comparator)的代碼重用,提高效率
  2. 比較器(Comparator)使用父類類型編寫,這樣子類也可以向上轉型使用。此爲父類引用指向子類在比較器中的實現

補充:

java中的泛型一共有是三種

  • ArrayList<T> al=new ArrayList<T>();          指定集合元素只能是T類型
  • ArrayList<?> al=new ArrayList<?>();             集合元素可以是任意類型,這種沒有意義,一般是方法中,只是爲了說明用法
  1. 編譯1:報錯:ArrayList<? extends E> al=new ArrayList<? extends E>();
  2. 編譯2:報錯:ArrayList<?> al=new ArrayList<?>();
  3. 編譯3:成功:ArrayList<?> al=new ArrayList<String>();
  •  泛型的限定:
  1. <? extends E>:接收E類型或者E的子類型。
  2. <?super E>:   接收E類型或者E的父類型。
                   
                   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章