有这样一种观点:List 和 List<Object> 是一样的
其实不然。
从两个方面来分析,1、类型限制 2、赋值限定
List 没有类型限制,add 或者 get 的时候,接收或者返回的对象类型是Object,所以在add时任何类型的对象均可,get时返回值类型为Object。List也没有赋值限定,即任何只要是集合类的对象均可,包括有类型限定的集合。
List<Object>有类型限制,类型限制为Object,但由于Object是所有类型的父类,所以在add时任何类型的对象均可,get时返回值类型也为Object。List<Object>也有赋值限定,只有类型是Object的集合对象才能赋值给List<Object>。
来看下面的例子:
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
List list = integerList; //可以赋值List<Integer>
list.add("String"); //添加String类型的数据
System.out.println(list); //输出结果:[1, 2, String]
List<Object> objectList = integerList; //编译报错
Object[] objectArr = new Integer[]{};
PS:看代码最后一行,数组是允许这样赋值的
那么List<?>又怎么用呢?
List<?>在没有赋值前,表示可以接收任何类型的集合,但是一旦赋值了,就只能remove、clear,不能add。常常用来作为参数接收外部的集合,或者返回一个不知道具体类型的集合。看下面的例子:
List<?> list1 = integerList;
list1.add(3); //编译报错
list1.remove(1);
list1.clear();