ArrayList与List接口如何理解

正确的写法:

public static List<List<Integer>> function(){
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        return list;
    }

 

错误写法1:

public static List<List<Integer>> function(){
        List<List<Integer>> list = new ArrayList<ArrayList<Integer>>(); //报错
        return list;
    }

 

错误写法2:

public static List<List<Integer>> function(){
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); 
        return list;//报错
    }

 

 

有价值的参考答案:

brayden

这个和 Arraylist实现, List接口没有关系.

Effective Java 2nd, item25:

Generics, by contrast, are invariant: for any two distinct types Type1
and Type2, List is neither a subtype nor a supertype of
List [JLS, 4.10; Naftalin07, 2.5].

为了防止下面的情况:

// Won't compile!
List<Object> ol = new ArrayList<Long>(); // Incompatible types
ol.add("I don't fit in");

针对你的问题:

 List<List<Integer>> list = new ArrayList<ArrayList<Integer>>(); //报错

如果按你的逻辑不报错, 那么list里可以放入ArrayList, 也可以放入LinkedList.
显然违反了类型安全.

List<List<Integer>> list = new ArrayList<ArrayList<Integer>>(); 
list.add(new LinkedList<Integer>()); //OOPS!

 

cow12331我的理解是泛型中只能代表类型,而不能实例化。List list = new ArrayList() 中的ArrayList 是实例化,List是类型。List<List> list = new ArrayList<List>() 的<>中的是类型。所以List<ArrayList> list = new ArrayList<ArrayList>()也是对的但List<List> list = new ArrayList<ArrayList>()是错的,因为类型不一样了。

brayden :泛型左右的<>里都是一样的. 实际上在java7之后, 一般都是这样写: List<List<Integer>> list = new ArrayList<>(); 称为Diamond Operator.

 

qq118194716

List<List<Integer>> result= new ArrayList<List<Integer>>();
List只是泛型接口,里面的也并不是ArrayList,而只是元素是List<Integer>类型的引用而已,被初始化为null
你赋值时它才知道自己的每个元素引用了一个什么样的List<Integer>的子类

 

xueqilinqqq:

可能我的表述有问题,我的意思是 外层的List我们显式地告诉了它 要引用的是ArrayList型的子类;
但是对于里层的List<Integer>,并没有明确地声明,照您所说,是等到我赋值的时候程序才知道子类的类型是ArrayList,那举个例子:
List<List<Integer>> result= new ArrayList<List<Integer>>();
可以理解为我在里层的List可以存储其他类型比如LinkedList的子类元素吗?

 

 

reference:http://segmentfault.com/q/1010000000626316

http://bbs.csdn.net/topics/391029212

posted @ 2015-08-05 05:44  Hygeia  阅读(1600)  评论(0编辑  收藏  举报