通用列表通用列表的初始化

时间:2013-09-20 03:10:42

标签: java list initialization

为什么我不能声明这样的列表列表?

List<List<Object>> a = new ArrayList<ArrayList<Object>>();

ArrayList的类型为List,所以我假设上面的代码是有效的。

这是有效的:

List<ArrayList<Object>> b = new ArrayList<ArrayList<Object>>();

内部列表必须声明为ArrayList。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

你混淆了你的仿制品。做你想做的事是

List<List<Object>> a = new ArrayList<List<Object>>();

通过在通用参数中使用ArrayList,您可以将对象的范围从List缩小到ArrayList,从而更改通用签名。通过在通用之外使用ArrayList,您仍然符合要求;您要指定要使用的List的哪个实现,以及它将保留的对象的类型为List<Object>,与左侧的状态完全相同。

要了解这一点很重要,请考虑以下列表:

// Invalid declaration, but pretend it is valid
List<List<Object>> a = new ArrayList<ArrayList<Object>>();
a.add(new ArrayList<Object>()); // valid
a.add(new LinkedList<Object>()); // not valid because it's not an ArrayList; 
                                 // but according to the left side, it is valid!

当然,最好的方法是使用Java 7的diamond operator

List<List<Object>> a = new ArrayList<>();

答案 1 :(得分:1)

这不是内部列表的问题,因为它是泛型参数的问题。只要通用参数相同(即ArrayList<Object>),初始化就会成功。否则,Java不允许您进行赋值,因为编译器无法保证类型安全。

想象一下这是可能的:

// Let's pretend this compiles:
List<List<Object>> a = new ArrayList<ArrayList<Object>>();

现在以下内容必须有效:

a.add(new LinkedList<Object>());

但是,这是无效的,因为该对象是ArrayList的{​​{1}},因此在其中插入链接列表显然无效。

但是你可以这样做:

ArrayList

这应该足以编程到界面。