这种奇怪的行为是什么原因造成的? 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
}