List List&ltObject&gt List&lt?&gt 之间的区别

有这样一种观点: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();

猜你喜欢

转载自blog.csdn.net/qq_28411869/article/details/87880039