在 Java 中,为什么以下代码行不起作用?
List<List<String>> myList = new ArrayList<ArrayList<String>>();
如果我把它改成
List<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();
起初,我想也许你不能有接口列表,但我可以创建一个列表
想法?
泛型类型更迂腐。
List
表示List
或任何子类型,但
我怀疑你可以用
List<List<String>> myList = new ArrayList<List<String>>();
不能这样做的原因是,您可以使用对引用的引用,并且需要额外的间接级别,您必须小心。
// with one level of indirection its simple.
ArrayList alist = new ArrayList();
List list = aList; // all good
list = new LinkedList(); // alist is still good.
使用泛型,您可以有两个级别的间接寻址,这可能会给您带来问题,因此它们会更加迂腐以避免这些问题。
// with two levels of indirection
List<ArrayList> alist = new ArrayList<ArrayList>();
List<List> list = (List) alist; // gives you a warning.
list.add(new LinkedList()); // adding a LinkedList into a list of ArrayList!!
System.out.println(alist.get(0)); // runtime error
印刷品
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList
cannot be cast to java.util.ArrayList
让我们从这个开始:
ArrayList<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();
这是创建一个 ArrayList,其元素是 ArrayLists。
现在假设我们可以将其分配给
List<List<String>> myList2 = myList.
现在,我们应该能够做到这一点:
myList2.add(new LinkedList<String>());
但这意味着我们已经将一个 LinkedList 添加到一个列表中,其元素应该是 ArrayLists。哎呀!!!
实际上,将myList
分配给myList2
是不合法的...这确保了不可能添加错误类型的列表
只有顶级集合可以声明为实现类,而嵌套集合必须保持接口,直到您实际创建实例:
List<List<String>> rootList = new ArrayList<List<String>>();
然后当你创建一个元素进去,你使它成为一个实现:
List<String> nodeList = new ArrayList<String>();
rootList.add(nodeList);