为什么在Java中没有“List<List<String>>”?

2022-09-01 12:48:26

在Java中,为什么以下代码行不起作用?

List<List<String>> myList = new ArrayList<ArrayList<String>>();

如果我将其更改为

List<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();

起初,我想也许你不能有一个接口的列表,但我可以创建一个刚刚好。List<Runnable>

想法?


答案 1

泛型类型更迂腐。

Listmeans 或任何子类型,但仅表示 。如果你想要一个子类型,你需要有List<List>List<? extends 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

答案 2

让我们从这里开始:

    ArrayList<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();

这是在创建一个 ArrayList,其元素是 ArrayList。

现在假设我们可以将其分配给

    List<List<String>> myList2 = myList.

现在,我们应该能够做到这一点:

    myList2.add(new LinkedList<String>());

但这意味着我们已经将LinkedList添加到一个列表中,其元素应该是ArrayLists。哎呀!!!

实际上,转让给是不合法的...这确保了不可能向对象添加错误的类型。(没有彼得,这不仅仅是学问:-))myListmyList2List<String>ArrayList<ArrayList<String>>