正确的写法:
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;//报错 }
有价值的参考答案:
这个和 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.
List<List<Integer>> result= new ArrayList<List<Integer>>();
List只是泛型接口,里面的也并不是ArrayList,而只是元素是List<Integer>类型的引用而已,被初始化为null
你赋值时它才知道自己的每个元素引用了一个什么样的List<Integer>的子类
可能我的表述有问题,我的意思是 外层的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