2011-10-02 64 views
4

我在Java中使用泛型時遇到了接口繼承的問題。 這裏是一個exampe:Java泛型與接口繼承結合使用

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> { } 

現在,當我嘗試使用SomeInterface1類型的字段,不類型參數的Java comiler治療的方法SomeInterface1.get()結果作爲Type0類型。而不能編譯這樣的事情:

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

那麼,爲什麼SomeInterface1<T extends Type1>T = Type0默認vlue?

回答

6

當忽略泛型參數時,幾乎所有泛型邏輯都會被跳過。確定T的類型不是'聰明',只是看T在該類/接口中定義的方式。

如果你想使用仿製藥的邏輯,你應該提供通用的參數,而不是讓他們出來 - 他們仍然可以非常好,「通用」:

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

既然你不使用當聲明SomeInteface1類型的對象時,java編譯器不知道在調用get()時它會返回什麼實際的類/接口。唯一可以肯定的是它是一個擴展Type0的接口(給定SomeInterface0的聲明)。

當你調用get()時,編譯器正在檢查聲明get()的接口的簽名,所以只能調用知道的唯一方法(沒有給出顯式類型參數),方法在Type0中聲明。

讓我知道如果我太混亂了,我會盡力澄清答案! :P

+1

謝謝,我明白了! )) – dbolotin