你为什么不能在Java中使用"List <List <String >>"?

Nos*_*tap 29 java list arraylist

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

List<List<String>> myList = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)

它可以工作,如果我改为

List<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)

起初,我想也许你不能有一个界面列表,但我可以创建一个List<Runnable>很好的.

想法?

Pet*_*rey 43

泛型类型更迂腐.

List是指List或任何子类型,但<List>仅指List.如果你想要一个你需要的子类型<? extends List>

我怀疑你可以使用

List<List<String>> myList = new ArrayList<List<String>>();
Run Code Online (Sandbox Code Playgroud)

你不能这样做的原因是你可以使用对引用的引用,并且需要额外的间接级别,你必须要小心.

// with one level of indirection its simple.
ArrayList alist = new ArrayList();
List list = aList; // all good
list = new LinkedList(); // alist is still good.
Run Code Online (Sandbox Code Playgroud)

使用泛型,你可以有两个级别的间接,这可以给你带来问题,所以他们更迂腐,以避免这些问题.

// 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
Run Code Online (Sandbox Code Playgroud)

版画

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList
     cannot be cast to java.util.ArrayList
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 9

让我们从这开始:

    ArrayList<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)

这是创建一个ArrayList,其元素是ArrayLists.

现在假设我们可以分配给它

    List<List<String>> myList2 = myList.
Run Code Online (Sandbox Code Playgroud)

现在,我们应该能够这样做:

    myList2.add(new LinkedList<String>());
Run Code Online (Sandbox Code Playgroud)

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

在现实中,分配myListmyList2不合法......并确保它是不可能加错了那种List<String>ArrayList<ArrayList<String>>对象.(没有彼得,这不仅仅是迂腐:-))