/** 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)
}