Java集合泛型--無泛型、Object泛型、?泛型之間的區別

/** List List<Object> List<Integer> List<?>之間的區別
	 *  集合之間的轉換和數組轉換之間的差異
	 * @param args
	 */
	public static void main(String[] args) {
		List list1 = new ArrayList();
		list1.add(new Object());
		list1.add(2);
		list1.add("不指定泛型的情況下,可以添加任意類型的元素");
		
		List<Object> list2 = list1;//不指定泛型的list1可以轉換成任意泛型類型的集合,下面用Integer泛型試試
		list2.add(new Object());
		list2.add(3);
		list2.add("指定Object泛型,也可以添加任意類型的元素,看上去和list1沒有區別");
		
		List<Integer> list3 = list1;//在jdk1.5之前,集合可以不適用泛型,但這樣會帶來隱患,使用泛型後,爲了與之前無泛型的集合兼容,所以這樣的轉換是允許的
		//List<Integer> list4 = list2;//這樣的轉換時不允許的,這就是無泛型集合與<Object>泛型集合的區別
		//反過來 List<Integer>轉換成List<Object>也是不允許的
		//數組可以轉換  Integer[] ---> Object[]   因爲數組是協變的
		Integer[] intArray = {1,2,3,4,5,6};
		Object[] objArray = intArray;
		Arrays.asList(objArray).stream().forEach(x->{System.out.print(x+"\t");});//輸出 1	  2	 3	4	5	6
		//list3.add("asdas");再添加其他類型元素是不被允許的
		list3.add(10);
		//輸出集合,可以看到list3還是相當於list1,只不過不再允許添加其他類型的元素了。同時帶來了許多隱患,
		System.out.println(list3);//[java.lang.Object@15db9742, 2, 不指定泛型的情況下,可以添加任意類型的元素, java.lang.Object@6d06d69c, 3, 指定Object泛型,也可以添加任意類型的元素,看上去和list1沒有區別, 10]
        
		List<?> list5 = list1;//List<?>可以接受任意類型的集合   list1-list3都可以轉換
		list5.remove(0);//轉換後的集合允許刪除和清除元素,不再允許添加元素
		list5.clear();//List<?>適合接收服務返回的集合數據
		System.out.println(list5);
		//list5.add();The method add(capture#3-of ?) in the type List<capture#3-of ?> is not applicable for the arguments (Object)
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章