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



对于普通(非泛型(方法,子方法需要覆盖等效于擦除父方法。

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

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;
}
}

我可以找到完成此检查的位置(hasSameBounds(。

为什么 Son2 不起作用?JLS中有什么描述吗?

Parent T example( Map<String, Integer> map) 签名的删除T example(Map map)

Son2T example(Map map) 的签名与ParentT example( Map<String, Integer> map)签名的删除相同。这使得两个签名的">覆盖等效"。

">...为什么 Son2 不起作用?...">

Son2不起作用,因为它与Parent覆盖等价。

">...JLS中有什么描述吗?...">

是的。有。。。

§8.4.2 方法签名

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

例 8.4.2-1.覆盖等效签名

class Point {
int x, y;
abstract void move(int dx, int dy);
void move(int dx, int dy) { x += dx; y += dy; }
}

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

相关内容

  • 没有找到相关文章

最新更新