用Java中的泛型方法覆盖泛型方法

Ble*_*der 13 java generics

Angelica Langer在她关于泛型的常见问题解答中说(见Technicalities.FAQ822):

如果方法具有不同边界的类型参数,则它们不会覆盖,因为这些方法具有不等于覆盖的签名.请记住,类型参数边界是泛型方法签名的一部分.

示例(通用子类型方法重载泛型超类型方法;不推荐):

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
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这个get方法在课堂上重载了Sub.对于我知道它应该是一个编译时错误,因为get在这两个相同的签名SubSuper(返回类型是不是它的一部分).

什么混淆我更是我使用测试代码的IDE(IntelliJ IDEA的14.0.3)强调getSub与下一消息的编译错误:

'Sub'中的'get()'与'Super'中的'get()'冲突; 两种方法都有相同的擦除,但都没有覆盖另一种方法.

但是当我运行程序时,它编译并执行没有问题.我认为IntelliJ在分析代码时存在某种错误,Angelica在她的常见问题解答中说的是正确的.但我无法理解这一点.

gee*_*mer 0

我认为 的擦除与 的擦除 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)