ArrayList与List接口如何理解

mac2022-06-30  63

正确的写法:

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 Type1and Type2, List is neither a subtype nor a supertype ofList [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

转载于:https://www.cnblogs.com/hygeia/p/4703657.html

最新回复(0)