首页 > List<?>, List, List<Object>, List<? extends Object>各有什么区别?

List<?>, List, List<Object>, List<? extends Object>各有什么区别?

List<?>, List, List<Object>, List<? extends Object>各有什么区别?


List是集合中的一种。
< >代表了泛型类型
List<?>代表任意类型
List<Object>表示这个集合中可以放object类型的对象
List<? extends Object>代表这个集合中可以放任何继承于object类的类型对象

如果想了解更多集合框架小姿势,可以看看我写的一篇专栏文章,里面有一章是关于集合框架的


List<?>List:说的是集合里可以放任意类型的对象,单独使用List的话,在Eclipse中会有警告;

List<Object>:说的是集合里存放Object类型的对象,理解Java中的继承、及向上转型机制,不难发现这个集合其实可以保存任意类型的对象;

List<? extends Object>:说的是该集合中保存的对象必须是Object类的子类对象;

具体可以参考《Java核心技术(第一卷)》关于泛型那部分的内容...


我感觉楼上几位的理解都有问题, 首先, List<?>表示无界通配符, 并非表示任意类型, 而是表示一个具体类型, 但是这个具体类型是什么我们编程的时候并不关心; List表示原生list, 没有泛型参数的list, 这个没有什么可以说的, 不推荐使用; List<Object> 表示的是这个list存放的是Object, 只要是Object就可以放入; 最后List<? extends Object>表示一个集合,这个集合存放的是Object具体子类中的某一种, 而非只要是object的子类就可以放入.

最后我想说的一点是<?>其实和<? extends Object>有点像, 这个像, 体现在他们可以互相匹配,并且不会产生任何警告 比如:

public class Base
{
    public static void unbounded(List<?> list){}
    public static void upBounded(List<? extends Object> list){}

    public static void main(String args[])
    {
        List<?> list1 = new ArrayList<Object>() ;
        List<? extends Object> list2 = new ArrayList<Object>() ;

        unbounded(list2) ;
        upBounded(list1) ;
    }
}

不过这些差异仅仅是在编译时编译器产生的, 到了运行时, 由于擦除, 全部都是List<Object>
我个人的一点理解


**List<?>, List, List<Object>, List<? extends Object> 区别如下:
1.了解JDK中的泛型,泛型是为了做类型检查,希望放在Collection中的东西,在编译的时候通过限定<>中的类型,可以做到尽量在编译时候检查出错误,而不要再线上运行的时候再抛异常。
2.List这样写,在eclipse中下面会有黄线,有警告的。而且也是不规范的写法,其余的都是规范的写法。
3.List<?>可以放任何类型;List<Object>只可以放Object类型,但由于Object是所有类的父类,所以其他类都可以通过在前面加(Object)强制类型转换,List<? extends Object>也是,可以放任何类或者是Object类本身。
希望对你有帮助~~**

【热门文章】
【热门文章】