2011-11-17 40 views
-1

我有一个扩展Node的Element类。 我想申报表<>这应该工作一样:如何声明泛型以便类和它的子类匹配

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

我应该使用什么样的泛型类型的?

+3

我不明白检查。你想要一个'Node'列表,但是想迭代它,就好像它们都是'Element's?为什么不创建一个'List '? –

回答

3

声明它为List<Element>

如果Bar extends Foo,则无法安全地将List<Foo>投射到List<Bar>


或者(不推荐!):

List<Node> elementsList; 

for (Node n : elementsList) 
{ 
    Element e = (Element) n; 
    // ... 
} 

,但在这样的速度,你还不如不使用泛型的。

+0

我不能一定是列表 firen

+4

@firen:为什么?你不能拥有这两种方式! –

+2

@firen如果它真的必须是'List '那你为什么问这个问题? –

0

这将编译,但并不安全:

 for (Node n : elementsList) { 
      Element e = (Element) n; 
     } 

所以基本上忽略了仿制药:

List<? extends Node> elementsList; 

如果它必须是节点剩下的唯一选择。

0

首先想到的是,当你收到父母名单时,为什么要使用子类?不能确定你总是会收到一个子类实例列表。 您可以通过父母对列表进行迭代,并与instanceof

public void testMethod(List<? extends Node> list){ 
    for(Node node: list){ 
     if(node instanceof Element){ 
         //bla bla bla 
        } 
    } 
}