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

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

阅读 11.7k
4 个回答

我感觉楼上几位的理解都有问题, 首先, 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的话,在Eclipse中会有警告;

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题