你为什么不能在Java中使用“List <List >”?
在Java中,为什么以下代码行不起作用?
List<List> myList = new ArrayList<ArrayList>();
它可以工作,如果我改为
List<ArrayList> myList = new ArrayList<ArrayList>();
起初,我想也许你不能有一个接口列表,但我可以创建一个List
就好了。
想法?
通用类型更迂腐。
List
表示List
或任何子类型,但
表示仅List
。 如果你想要一个子类型,你需要 extends List>
extends 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。 哎呀!
实际上, myList
到myList2
的赋值是不合法的……这确保了不可能将错误类型的List
到ArrayList
对象。 (没有彼得,这不仅仅是迂腐:-))
只有顶级集合可以声明为实现类,而嵌套的集合必须保留接口,直到您实际创建实例:
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
),我生成一个单独的List Type( List
),然后.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; } }