对于普通(非泛型(方法,子方法需要覆盖等效于擦除父方法。
但是对于泛型方法,子方法需要具有相同类型的参数,这意味着每个参数都有相同的边界,例如:
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)
。
Son2
T example(Map map)
的签名与Parent
T 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
,这也是一个错误。。