在Java中,为什么以下代码行不起作用?
List<List<String>> myList = new ArrayList<ArrayList<String>>();
如果我将其更改为
,则有效List<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();
起初,我想也许你不能拥有一个界面列表,但我可以创建一个List<Runnable>
就好了。
想法?
答案 0 :(得分:42)
通用类型更迂腐。
List
表示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
答案 1 :(得分:9)
让我们从这开始:
ArrayList<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();
这是创建一个ArrayList,其元素是ArrayLists。
现在假设我们可以将其分配给
List<List<String>> myList2 = myList.
现在,我们应该能够做到这一点:
myList2.add(new LinkedList<String>());
但这意味着我们已将LinkedList添加到其元素应为ArrayLists的列表中。哎呀!!!
实际上,myList
到myList2
的分配不合法......这可以确保无法向{{1}添加错误的List<String>
种ArrayList<ArrayList<String>>
对象。 (没有彼得,它不是只是 pedantry :-))
答案 2 :(得分:3)
只有顶级集合可以声明为实现类,而嵌套的集合必须保留接口,直到您实际创建实例:
List<List<String>> rootList = new ArrayList<List<String>>();
然后在创建要进入的元素时,将其作为实现:
List<String> nodeList = new ArrayList<String>();
rootList.add(nodeList);
答案 3 :(得分:1)
将左侧(声明)侧的Type
与右侧(实例化)侧的Type
进行比较。在左侧,您的类型为List<String>
,而在右侧,则为ArrayList<String>
。如果抱怨差异。
请将右侧(instatiation)更新为List,即
List<List<String>> myList = new ArrayList<List<String>>();
这应该可以正常工作。
答案 4 :(得分:0)
我知道这是一个老问题,但我只想分享我的想法。
我没有制作列表列表,而是亲自创建一个列表[](List<Type[]> listArray = new ArrayList<Type[]>();
),我生成一个单独的列表,只列出类型(List<Type> list = new ArrayList<Type>();
),然后{{1} }。这样,它比列表列表语法更清晰,更容易阅读,这令人困惑。
例如,在最近的一个项目中,我有一个输入文件,其中每一行只有一个&#34; 0&#34;意味着原始的新行(它是加密算法):
.add(list.toArray())
答案 5 :(得分:0)
如果列表中包含另外一个列表,则允许list<list<string>> l1=new list<list<string>>();
。
public final class CPanelXMLBuilder extends PanelXMLBuilder {
public CPanelXMLBuilder(AuthenticatedUser pAuthenticatedUser, Map<String, Object> pSessionMap, Map<String, Object> pRequestMap, String pPanelTemplate) throws Exception {
super(pAuthenticatedUser, pSessionMap, pRequestMap, pPanelTemplate, null);
}
public Map<String, Object> buildXMLDocument(List<List<String>> pDetailsList) {
if (pDetailsList.size() == 1) {
List<String> 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;
}
}