2011-11-17 2 views
-1

Node를 확장하는 class 요소가 있습니다.generic을 선언하여 클래스와 서브 클래스가 일치하도록하는 방법

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

내가 제네릭 형식의 어떤 종류를 사용한다 : 내가 좋아하는 일을해야 목록 <>를 선언하고 싶은 ?

+3

으로 확인할 수 있습니다. 당신은'Node's의 목록을 원하지만 그것들이 모두'Element's 인 것처럼 반복하고 싶습니까? 'List '을 만들면 어떨까요? –

답변

3

List<Element>으로 지정하십시오.

Bar extends Foo 인 경우 List<Foo>List<Bar>으로 안전하게 전송할 수 없습니다.


다른 방법 (권장하지 않음!) :

List<Node> elementsList; 

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

하지만 당신은뿐만 아니라 모든 제네릭을 사용하지 않을 수도 그 속도

.

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

그래서 기본적으로 제네릭을 무시 :

+0

목록이 틀림 없습니다. firen

+4

@firen : 이유가 무엇입니까? 두 가지 방법을 모두 가질 수는 없습니다! –

+2

@firen 정말리스트'' '이라면 왜이 질문을 했습니까? –

0

이 컴파일하지만 안전하지 않습니다는 : 그것은 노드이어야합니다

List<? extends Node> elementsList; 

유일한 옵션은 왼쪽.

0

첫 번째 생각 - 왜 부모 목록을받을 때 하위 클래스를 사용하려고합니까? 항상 하위 클래스 인스턴스 목록을 받을지 확신 할 수 없습니다. 당신은 부모의 목록을 반복하고 이해가 안 instanceof

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