在 Java 中用泛型方法重写泛型方法
Angelica Langer在她的FAQ中说了关于泛型(参见Technialities.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 }
我不明白为什么该方法在类中重载。据我所知,它应该是一个编译时错误,因为两者具有相同的签名和(返回类型不是它的一部分)。get
Sub
get
Sub
Super
更让我困惑的是,我用来测试代码的IDE(IntelliJ IDEA 14.0.3)在下一条消息中突出显示为编译错误:get
Sub
“Sub”中的“get()”与“Super”中的“get()”冲突;这两种方法具有相同的擦除,但都不能覆盖另一种方法。
但是当我运行程序时,它可以编译并执行而不会出现问题。我想IntelliJ在分析代码时存在某种错误,而正确的是Angelica在她的FAQ中讲述的内容。但我无法抓住重点。