Java 为什么重写泛型方法需要相同的边界?

Java 为什么重写泛型方法需要相同的边界?,java,jls,Java,Jls,对于普通(非泛型)方法,要求子方法的重写等效于父方法的擦除 但是对于泛型方法,子方法必须具有相同类型的参数,这意味着对于每个参数都具有相同的边界,例如: public abstract class Parent { public abstract <T> T example( Map<String, Integer> map) throws Exception; } public class Son1 extends Parent { // this could

对于普通(非泛型)方法,要求子方法的重写等效于父方法的擦除

但是对于泛型方法,子方法必须具有相同类型的参数,这意味着对于每个参数都具有相同的边界,例如:

public abstract class Parent {
    public abstract <T> T example( Map<String, Integer> map) throws Exception;
}
public class Son1 extends Parent {
// this could work
    @Override
    public <T> T example(Map<String, Integer> map) throws Exception {
        return null;
    }
}

public class Son2 extends Parent {
// and this couldn't work
    @Override
    public <T> T example(Map map) throws Exception {
        return null;
    }
}
public class Son3 extends Parent {
// and this could work
    @Override
    public Object example(Map map) throws Exception {
        return null;
    }
}
公共抽象类父类{
公共抽象T示例(Map)抛出异常;
}
公共类Son1扩展了父类{
//这可能行得通
@凌驾
公共T示例(映射)引发异常{
返回null;
}
}
公共类Son2扩展了父类{
//这是行不通的
@凌驾
公共T示例(映射)引发异常{
返回null;
}
}
公共类Son3扩展了父类{
//这可能奏效
@凌驾
公共对象示例(映射)引发异常{
返回null;
}
}
我可以找到这张支票在哪里完成()

为什么Son2不工作?JLS中是否有任何描述?

父级
T示例(映射图)
T示例(映射图)

Son2
T示例(映射图)
的签名
T示例(映射图)
的签名的擦除相同。这使得这两个签名是“的”

“为什么Son2不工作?”

Son2
不起作用,因为它的覆盖等价于
父项

“JLS中是否有任何描述?”

是的,有

在一个类中声明两个具有重写等效签名的方法是编译时错误。

示例8.4.2-1.覆盖等效签名 此程序导致编译时错误,因为它声明了两个具有相同(因此重写等效)签名的
move
方法。即使其中一个声明是
abstract
,这也是一个错误


不,用参数类型为
Map
的方法覆盖参数类型为
Map
的方法始终是个问题-它总是会导致“原始类型”。原始类型仅用于与Java 1.5之前的代码向后兼容。在方法中将原始类型与泛型类型参数相结合,如
public T示例中所示(Map Map)
毫无意义(因为原始类型只存在于不理解泛型的代码中),因此被拒绝。@ErwinBolwidt Son3的情况是为了向后兼容,在JLS中已经描述过。但我不明白为什么Son2不能工作,而Son1可以在JLS中工作。这就是问题所在。
class Point {
    int x, y;
    abstract void move(int dx, int dy);
    void move(int dx, int dy) { x += dx; y += dy; }
}