为什么我不能声明这样的列表列表?
List<List<Object>> a = new ArrayList<ArrayList<Object>>();
ArrayList的类型为List,所以我假设上面的代码是有效的。
这是有效的:
List<ArrayList<Object>> b = new ArrayList<ArrayList<Object>>();
内部列表必须声明为ArrayList。
有人可以解释一下吗?
答案 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
这应该足以编程到界面。