2013-03-18 2 views
3

가정하자 나는 다음과 같이 정의하는 추상 클래스 : 다음과 같이 정의상속 제네릭

public class Response<T> { 
    private List<Response<T>> subResponses; 
} 

과 두 개의 서브 클래스 :

public class SectionResponse extends Response<SectionResponse> { 
} 

public class FormResponse extends Response<FormResponse> { 
} 

는 기본적으로 응답의 모든 서브 클래스가 같은 클래스의 목록이 필요합니다. 이제 코드의 다른 곳에서 하위 클래스 중 하나를 포함 할 수있는 Response 객체 목록을 갖기를 원합니다.

원시 형식을 사용하지 않고이 목록을 정의하는 가장 좋은 방법은 무엇입니까? 시도했습니다 List<? extends Response<?>>하지만 매개 변수가있는 매개 변수가있는 형식 때문에이 같은 정의 된 목록에서 add 메서드를 호출 할 수 없습니다.

+0

'리스트' 확장>를? 그냥 큰 소리로 생각하고있어. –

+0

@JanDvorak : 자바 구문이 유효하지 않습니다. – newacct

답변

3

Put-Get-Rule을 사용하십시오. 즉, List<? extends Response<?>>을 반환하지만 List<? super Response<?>>을 매개 변수로 허용합니다. 내부적으로 목록을 List<Response>

으로 저장합니다. 소비자에게 침해받을 수 있으므로 인터페이스에 List<? extends Response<?>>을 반환하는 것에주의해야합니다. 대부분의 경우 인터페이스가 제네릭 형식을 못 박는 것이 더 좋으므로 가능한 경우 List<Response<MyType>>과 같은 것을 반환합니다.

1

는 귀하의 Response 클래스는 다음과 같이 정의한다 :

public class Response<T> { 
    private List<T> subResponses; 
} 

은 그래서 SectionResponseFormResponse, 선언, 자신의 목록을해야합니다.

문자 그대로 질문에 대답하거나, 둘 중 하나를 포함 할 수있는 목록에 대해 List<Response<?>>을 사용할 수 있습니다.

그러나 이보다 더 많은 것을 원할 것입니다. 아마도 요소를 목록에서 꺼내 뭔가를하고 싶을 것입니다. 당신이 할 수있는 일에 대해 더 구체적으로 말할 수 있다면, 우리는 당신을 더 도울 수 있습니다.

0

내가 당신이 원하는 정확히 모르겠어요 인정 하겠지만,이 정도의 작품이 적어도 당신이 설명하는 문제에 접촉 :

public class Response<T extends Response> { 
    private List<T> sl = new LinkedList<T>(); 

    protected void add(T resp) { 
     sl.add(this); 
    } 
} 

public class FormResponse extends Response<FormResponse> { 
    public FormResponse() { 
     add(this); 
    } 
} 
관련 문제