Node를 확장하는 class 요소가 있습니다.generic을 선언하여 클래스와 서브 클래스가 일치하도록하는 방법
이List<Node> elementsList;
for(Element e : (List<Element>) elementsList) {
}
내가 제네릭 형식의 어떤 종류를 사용한다 : 내가 좋아하는 일을해야 목록 <>를 선언하고 싶은 ?
Node를 확장하는 class 요소가 있습니다.generic을 선언하여 클래스와 서브 클래스가 일치하도록하는 방법
이List<Node> elementsList;
for(Element e : (List<Element>) elementsList) {
}
내가 제네릭 형식의 어떤 종류를 사용한다 : 내가 좋아하는 일을해야 목록 <>를 선언하고 싶은 ?
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;
}
그래서 기본적으로 제네릭을 무시 :
목록이 틀림 없습니다.
@firen : 이유가 무엇입니까? 두 가지 방법을 모두 가질 수는 없습니다! –
@firen 정말리스트''
이 컴파일하지만 안전하지 않습니다는 : 그것은 노드이어야합니다
List<? extends Node> elementsList;
유일한 옵션은 왼쪽.
첫 번째 생각 - 왜 부모 목록을받을 때 하위 클래스를 사용하려고합니까? 항상 하위 클래스 인스턴스 목록을 받을지 확신 할 수 없습니다. 당신은 부모의 목록을 반복하고 이해가 안 instanceof
public void testMethod(List<? extends Node> list){
for(Node node: list){
if(node instanceof Element){
//bla bla bla
}
}
}
으로 확인할 수 있습니다. 당신은'Node's의 목록을 원하지만 그것들이 모두'Element's 인 것처럼 반복하고 싶습니까? 'List'을 만들면 어떨까요? –