2011-08-17 3 views
4

이 작동을 반환하는 함수를 오버라이드 (override) :자바 제네릭 - 세트 <T>

public interface A { 
    A doSomething(); 
} 

public interface B extends A{ 
    B doSomething(); 
} 

이되지 않습니다

public interface A { 
    Collection<A> doSomething(); 
} 

public interface B extends A{ 
    Collection<B> doSomething(); 
} 

이유는 무엇입니까? 두 번째 예제에서 원하는 기능을 얻으려면 어떻게해야합니까? 에

답변

3

변경을 :

public interface A { 
    Collection<? extends A> doSomething(); 
} 

public interface B extends A{ 
    Collection<B> doSomething(); 
} 

그것은 제대로 작동합니다.

"B 컬렉션은 A"컬렉션을 확장하지 않기 때문에 B가 A를 확장하더라도 A는 반환 유형을 "A를 확장하는 항목 컬렉션"으로 정의해야합니다. "는 B의 수집."혼란, 그래 ...하지만 그게 얼마나 단지로.

6

이유는 Collection<B>Collection<A>의 하위 유형 되지 않는 것입니다.

하지 가능성이 모든 작업 Collection<A>의 경우 Collection<B>으로도 가능합니다. 사례 : add(new A())으로 전화하면 Collection<A>으로 작동합니다. Collection<B> (비록 컴파일 타임에 체크 된 경우 일지라도)이 일 때 실패해야합니다.

당신은 상관하지 않는 경우에 대한 (만 그들을 그들이 것처럼 읽기 전용 치료를 효과적으로 그들을 반복 신경 자주) 반환 Collection- 요소를 추가 , 당신이 수행 할 수 있습니다

public interface A { 
    Collection<? extends A> doSomething(); 
} 

public interface B extends A{ 
    Collection<? extends B> doSomething(); 
} 

B.doSomething()은 원할 경우 Collection<B>을 반환 할 수 있지만 같은 방법으로 B을 다시 확장 할 수는 없습니다.