为什么在通用和非泛型方法中使用通配符的不兼容返回类型会覆盖?

时间:2017-10-30 20:53:34

标签: java generics override

这种奇怪的行为是什么原因造成的? List<? super Number>是&#34;更窄&#34; (&#34;更专业&#34;)而不是List<?>,因此下面示例1中的代码将失败!当我在Base类(接口)中的重写方法中有List<?>返回类型时,在Derived类(接口)中将List<? super Number>作为重写方法的返回类型总是可以的 - 它在例如像1-3我理解为什么。

1。 Superinterface(I1)方法是通用的,子接口(I2)方法不通用。子接口(I2)中的协变返回编译良好:

interface I1 {
    public <T> List<? super Number> f() throws IOException;
}

interface I2 extends I1 {
    public List<?> f() throws EOFException; // compiles! covariant return is OK! 
}

2。两种接口方法都是通用的 - 在I2中编译错误。 Superinterface(I1)方法是通用的,子接口(I2)方法也是通用的。子接口(I2)中的协变返回给出编译错误&#34;返回类型与I1.f()&#34; 不兼容:

interface I1 {
    public <T> List<? super Number> f() throws IOException;
}

interface I2 extends I1 {
    public <T> List<?> f() throws EOFException; // covariant return fails 
}

第3。两种接口方法都是非泛型的 - I2中的编译错误。 Superinterface(I1)方法是非泛型的,子接口(I2)方法也是非泛型的。子接口(I2)中的协变返回给出与2中相同的编译错误 - &#34;返回类型与I1.f()&#34;

不兼容
interface I1 { 
    public List<? super Number> f() throws IOException;
} 

interface I2 extends I1 { 
    public List<?> f() throws EOFException; // covariant return fails 
} 

0 个答案:

没有答案