我有一个扩展Node的类Element。 我想声明一个List<>这应该像:
List<Node> elementsList;
for( Element e : (List<Element>) elementsList ) {
}
我应该使用哪种通用类型?
答案 0 :(得分:3)
将其声明为List<Element>
。
如果Bar extends Foo
,您无法安全地将List<Foo>
投放到List<Bar>
。
另外 (不推荐!) :
List<Node> elementsList;
for (Node n : elementsList)
{
Element e = (Element) n;
// ...
}
但按照这个速度,你可能根本不使用泛型。
答案 1 :(得分:0)
这会编译但不安全:
List<? extends Node> elementsList;
如果必须是Node:
,则唯一的选择 for (Node n : elementsList) {
Element e = (Element) n;
}
所以基本上忽略了泛型。
答案 2 :(得分:0)
首先想到 - 为什么在收到父母列表时会尝试使用子类?您无法确定是否始终会收到子类实例列表。
您可以遍历父母列表并查看instanceof
public void testMethod(List<? extends Node> list){
for(Node node: list){
if(node instanceof Element){
//bla bla bla
}
}
}