2011-10-02 6 views
4

자바의 제네릭에 인터페이스 상속과 함께 문제가 있습니다. 내가 Type0SomeInterface1.get() 방법 결과의 유형을 취급 comiler 형식 매개 변수 자바없이 유형 SomeInterface1의 필드를 사용하려고 할 때, 이제Java generics와 인터페이스 상속

public interface Type0 { } 

public interface Type1 extends Type0 { 
    void method(); 
} 

public interface SomeInterface0<T extends Type0> { 
    T get(); 
} 

public interface SomeInterface1<T extends Type1> extends SomeInterface0<T> { } 

: 은 여기 exampe입니다. 그리고 이런 식으로 뭔가를 컴파일 할 수 없습니다 :

... 
SomeInterface1 si1; 
... 
si1.get().method(); 

그래서, SomeInterface1<T extends Type1>T = Type0에 대한 기본 vlue을 가지고 그 이유는 무엇입니까?

답변

6

제네릭 매개 변수를 생략하면 거의 모든 제네릭 논리가 건너 뜁니다. T의 유형을 결정하는 것은 '똑똑한'것이 아니며 T가 해당 클래스/인터페이스 내에서 정의되는 방식을 살펴보십시오. 당신은 제네릭 논리를 사용하려면

, 대신 그들을 떠날 일반적인 매개 변수를 제공해야한다 - 그들은 여전히 ​​아주 잘, '일반적인'가 될 수 있습니다

SomeInterface2<? extends Type1> si1; 
si1.get().method(); 
2

당신이 사용하지 않을 때문에 SomeInteface1 유형의 객체를 선언 할 때 type 매개 변수를 사용하면 java 컴파일러는 get()을 호출 할 때 반환 할 실제 클래스/인터페이스를 알지 못합니다. 유일한 것은 그것이 Type0을 확장하는 인터페이스 (SomeInterface0의 선언이 주어짐)입니다.

get()을 호출하면 컴파일러에서 get()이 선언 된 인터페이스의 서명을 검사하므로 (명시 적 매개 변수없이) 호출 할 수 있습니다. Type0에 선언되었습니다.

제가 너무 혼란 스럽다면 저에게 답변을 정리해 드리겠습니다. : P

+1

감사합니다. 아이디어를 얻었습니다!)) – dbolotin