你为什么不能在Java中使用“List <List >”?

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

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

它可以工作,如果我改为

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

起初,我想也许你不能有一个接口列表,但我可以创建一个List就好了。

想法?

通用类型更迂腐。

List表示List或任何子类型,但表示仅List 。 如果你想要一个子类型,你需要

我怀疑你可以使用

 List> myList = new ArrayList>(); 

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

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

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

 // with two levels of indirection List alist = new ArrayList(); 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> myList = new ArrayList>(); 

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

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

  List> myList2 = myList. 

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

  myList2.add(new LinkedList()); 

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

实际上, myListmyList2的赋值是不合法的……这确保了不可能将错误类型的ListArrayList>对象。 (没有彼得,这不仅仅是迂腐:-))

只有顶级集合可以声明为实现类,而嵌套的集合必须保留接口,直到您实际创建实例:

 List> rootList = new ArrayList>(); 

然后当你创建一个元素进入时,你将它作为一个实现:

 List nodeList = new ArrayList(); rootList.add(nodeList); 

它比较Type从左(声明)侧到Type从右(实例化)侧。 在Left中,您的类型是List而在右侧,它是ArrayList 。 如果抱怨差异。

请将右侧(instatiation)更新为List ie

  List> myList = new ArrayList>(); 

这应该工作正常。

我知道这是一个老问题,但我只是想分享我的想法。

而不是制作列表列表,我个人只是创建一个List of Type []( List listArray = new ArrayList(); ),我生成一个单独的List Type( List list = new ArrayList(); ),然后.add(list.toArray()) 。 这样,它比列表列表语法更清晰,更容易阅读,这令人困惑。

例如,在最近的一个项目中,我有一个输入文件,其中每行只有一个“0”表示原始的新行(它是加密算法):

 String[] input = getInputContents(inFile); List currentBuffer = new ArrayList(); List buffers = new ArrayList(); for(String line : input) { if(line.equals("0")) { buffers.add((String[])currentBuffer.toArray()); currentBuffer = new ArrayList(); } else { currentBuffer.add(line); } } 

list> l1=new list>(); 如果列表在列表中包含一个列表,则允许。

 public final class CPanelXMLBuilder extends PanelXMLBuilder { public CPanelXMLBuilder(AuthenticatedUser pAuthenticatedUser, Map pSessionMap, Map pRequestMap, String pPanelTemplate) throws Exception { super(pAuthenticatedUser, pSessionMap, pRequestMap, pPanelTemplate, null); } public Map buildXMLDocument(List> pDetailsList) { if (pDetailsList.size() == 1) { List pCustomerDetail = pDetailsList.get(0); xmlDocument.getRootElement().getChild("E_SHOW1").setText(pCustomerDetail.get(0)); xmlDocument.getRootElement().getChild("E_SHOW2").setText(pCustomerDetail.get(1)); xmlDocument.getRootElement().getChild("E_SHOW3").setText(pCustomerDetail.get(2)); xmlDocument.getRootElement().getChild("E_SHOW4").setText(pCustomerDetail.get(3)); xmlDocument.getRootElement().getChild("E_SHOW5").setText(pCustomerDetail.get(4)); xmlDocument.getRootElement().getChild("ServerTimestamp").setText(pCustomerDetail.get(5).substring(0, 19)); } else { xmlDocument.getRootElement().getChild("AlertType").setText("INFO"); xmlDocument.getRootElement().getChild("Alert").setText("There is no matching record."); } requestMap.put(RequestMapKeys.XML_DOCUMENT, xmlDocument); return requestMap; } }