本问题已经有最佳答案,请猛点这里访问。
在Java中,为什么下面的代码行不起作用呢?
List> myList = new ArrayList>();
如果我把它改成
List> myList = new ArrayList>();
起初,我想也许你不能有一个接口列表,但是我可以创建一个List,很好。
思想?
埃多克斯1〔0〕怎么样?
@madth3 new arraylist>()仅当list是java.awt.list,而不是同一个package then arralist
@CL-R:解释一下好吗?
list是java.awt中的一个类,是java.util包中的一个接口。所以你必须关心什么对你有好处。因为'ArayListStordx1,3,Java,UTIXOCX1,4,java. UTIL.LIST可以在EDCOX1 5中列出。:1&176;)如果您想使用ArrayList2&176;)的ArrayList,new ArrayList>()将编译为java.awt.List,那么new ArrayList>()很好。
一般类型更迂腐。
List表示List或任何子类型,但只表示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.
使用泛型,你可以有两个间接的层次,这可以给你带来问题,所以他们更学究,以避免这些问题。
// 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
是的,这似乎行得通。你能解释一下为什么吗?谢谢
可以将LinkedList添加到List>中。不能将LinkedList添加到ArrayList>中。因此,不能创建引用ArrayList>的List>类型的变量,因为它们具有不同的行为。
对于非泛型类型,您可以将ArrayList分配给List,因为它将隐式地为您强制转换它。对于泛型类型,不能将强制转换为,因为它们是不同的类型。当ArrayList扩展列表时,可以将强制转换为extends List>。
list是一个接口(java.awt.list是一个类),不能实例化它。ArayLIST是一个实现Java.UTL.ListE*E的具体实例,建议在该字段中用接口代替它,正如您在第一个示例中所做的那样。
问题的产生是因为有可能改变列表,添加不合格类的对象。如果你不改变列表,问题就消失了。是否有方法声明您不会更改列表?
List>可以支持get(n)和remove(e)但不支持add(e)以防止添加无效引用。(除非你铸造它)
让我们从这个开始:
ArrayList> myList = new ArrayList>();
这将创建一个元素为arraylist的arraylist。
现在假设我们可以把它分配给
List> myList2 = myList.
现在,我们应该能够做到:
myList2.add(new LinkedList());
但这意味着我们已经向一个元素应该是数组列表的列表中添加了一个LinkedList。哎哟!!!!
实际上,将myList转让给myList2是不合法的……这就确保了不可能在ArrayList>对象中添加错误类型的List。(不,彼得,这不仅仅是学究式的——)
很好的解释。
只有顶级集合才能声明为实现类,而嵌套集合必须保留接口,直到实际创建实例:
List> rootList = new ArrayList>();
然后,当您创建一个要进入的元素时,您使它成为一个实现:
List nodeList = new ArrayList();
rootList.add(nodeList);
"……"嵌套实例必须保持接口,直到您实际创建实例"这不是真的"。list>x是有效声明,然后x=new arraylist>();确实有效。
它比较了从左(声明)侧到右(实例化)侧的Type。左边是List,右边是ArrayList。如果抱怨差异。
请将右侧(安装)更新为列表,即
List> myList = new ArrayList>();
这应该很管用。
如果列表中还包含一个列表,则允许使用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;
}
}
我知道这是个老问题,但我只想分享我的想法。
我没有列出清单,我只是列出了一个类型为[]的清单(ListlistArray = new ArrayList();),我生成了一个单独的类型为(Listlist = 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);
}
}