2011-10-02 114 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