为什么我不能像这样声明一个列表的列表?
List<List<Object>> a = new ArrayList<ArrayList<Object>>();
ArrayList 是 List 类型,所以我假设上面的代码是有效的。
虽然这是有效的:
List<ArrayList<Object>> b = new ArrayList<ArrayList<Object>>();
内部列表必须声明为 ArrayList。
谁能解释一下?
最佳答案
你混淆了你的泛型。做你想做的事情的方法是
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<>();
关于java - Generic List 的 Generic List 的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18908232/