如何声明泛型,以便类及其子类匹配

时间:2011-11-17 12:00:45

标签: java generics

我有一个扩展Node的类Element。 我想声明一个List<>这应该像:

List<Node> elementsList;
for( Element e : (List<Element>) elementsList ) {
}

我应该使用哪种通用类型?

3 个答案:

答案 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
                    }
    }
}