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)
	}
发布了27 篇原创文章 · 获赞 27 · 访问量 4292

猜你喜欢

转载自blog.csdn.net/qq_41788977/article/details/93890948