2011-11-17 66 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 
        } 
    } 
}