Java 为什么在泛型和非泛型方法重写中编译带有通配符的不兼容返回类型?
这种奇怪行为的原因是什么<代码>列表,因此下面示例1中的代码将失败!当我在基类(接口)中的重写方法中有Java 为什么在泛型和非泛型方法重写中编译带有通配符的不兼容返回类型?,java,generics,overriding,Java,Generics,Overriding,这种奇怪行为的原因是什么列表,因此下面示例1中的代码将失败!当我在基类(接口)中的重写方法中有List返回类型时,让List f()抛出EOFEException;//编译!协变返回是可以的! } 2。这两种接口方法都是泛型的-I2中的编译错误。超级接口(I1)方法是泛型的,子接口(I2)方法也是泛型的。子接口(I2)中的协变返回给出编译错误“返回类型与I1.f()不兼容”: 接口I1{ public List f()抛出EOFEException;//协变返回失败 } 3。这两种接口方法都
List
返回类型时,让List f()抛出EOFEException;//编译!协变返回是可以的!
}
2。这两种接口方法都是泛型的-I2中的编译错误。超级接口(I1)方法是泛型的,子接口(I2)方法也是泛型的。子接口(I2)中的协变返回给出编译错误“返回类型与I1.f()不兼容”:
接口I1{
public List f()抛出EOFEException;//协变返回失败
}
3。这两种接口方法都是非泛型的-I2中的编译错误。超级接口(I1)方法是非泛型的,子接口(I2)方法也是非泛型的。子接口(I2)中的协变返回给出了与2中相同的编译错误-“返回类型与I1.f()不兼容”:
接口I1{
public List f()抛出EOFEException;//协变返回失败
}
非常有趣。我很想看到有效的解释。奇怪的是,它甚至编译了以下内容:publicslist f()我自己也为这个问题绞尽脑汁很久了。我注意到一种模式,其中代码仅在父方法声明类型参数而子方法不声明类型参数时才编译(在本例中为
)。如果调用i2.f()
,会发生什么情况?如果调用i2.f()
?我想,如果不指定T
类,就无法有效地调用参数化方法,编译器将始终能够区分这两种方法。。。如果将原始方法更改为public List会怎么样
interface I1 {
public <T> List<? super Number> f() throws IOException;
}
interface I2 extends I1 {
public List<?> f() throws EOFException; // compiles! covariant return is OK!
}
interface I1 {
public <T> List<? super Number> f() throws IOException;
}
interface I2 extends I1 {
public <T> List<?> f() throws EOFException; // covariant return fails
}
interface I1 {
public List<? super Number> f() throws IOException;
}
interface I2 extends I1 {
public List<?> f() throws EOFException; // covariant return fails
}