Angelica Langer在她关于泛型的常见问题解答中说(见Technicalities.FAQ822):
如果方法具有不同边界的类型参数,则它们不会覆盖,因为这些方法具有不等于覆盖的签名.请记住,类型参数边界是泛型方法签名的一部分.
示例(通用子类型方法重载泛型超类型方法;不推荐):
Run Code Online (Sandbox Code Playgroud)class Super { public <T> void set( T arg) { ... } public <T> T get() { ... } } class Sub extends Super { public <S extends Number > void set( S arg) { ... } // overloads public <S extends Number > S get() { ... } // overloads }
我不明白为什么这个get方法在课堂上重载了Sub.对于我知道它应该是一个编译时错误,因为get在这两个相同的签名Sub和Super(返回类型是不是它的一部分).
什么混淆我更是我使用测试代码的IDE(IntelliJ IDEA的14.0.3)强调get在Sub与下一消息的编译错误:
'Sub'中的'get()'与'Super'中的'get()'冲突; 两种方法都有相同的擦除,但都没有覆盖另一种方法.
但是当我运行程序时,它编译并执行没有问题.我认为IntelliJ在分析代码时存在某种错误,Angelica在她的常见问题解答中说的是正确的.但我无法理解这一点.
我认为 的擦除与 的擦除 public <S extends Number> S get() 不同或协变public <T> T get()。
编译并运行:
class B {
public <T> T get() {
return null;
}
}
class A extends B {
@Override
public <S> S get() {
return null;
}
Run Code Online (Sandbox Code Playgroud)
这不会:
class B {
public <T> T get() {
return null;
}
}
class A extends B {
@Override
public <S extends Number> S get() {
return null;
}
Run Code Online (Sandbox Code Playgroud)