什么是“覆盖等效”,它与@Override有何关系?
阅读Javadoc的注释,我遇到了以下规则:@Override
如果某个方法使用此批注类型进行批注,则编译器需要生成错误消息,除非至少满足以下条件之一:
- 该方法会重写或实现在超类型中声明的方法。
- 该方法具有一个签名,该签名与 Object 中声明的任何公共方法的签名等效。
我对第一点很清楚,但我不确定第二点。
“覆盖等效”是什么意思?在这方面,公共方法有何特殊之处?为什么这不包括在第一个标准之下?Object
此外,这只适用于 Java 7+ 文档。Java 6 文档没有说明任何关于覆盖等效性的内容。为什么要进行更改?
更新:
在进一步咨询 JLS(第 8.4.2 节)后,我发现了以下对覆盖等效性的解释:
方法的签名是方法签名的子签名,如果出现以下任一情况:
m1
m2
m2
具有 与 相同的签名,或者m1
- 的签名与 的签名的擦除 (§4.6) 相同。
m1
m2
两个方法签名
m1
和m2
是覆盖等效签名,其中m1
是m2
的子签名,或者m2
是m1
的子签名。
据我所知,这回答了第一个问题(“这是什么意思?”)和第三个问题(“为什么第一个条件不涵盖这一点?”)。
如果我理解正确(如果我没有理解,请通知我!),只有一种情况,其中两种方法是覆盖等效的,并且不属于原始问题的第一个条件。当子类方法的签名的擦除与超类方法的签名相同,但相反时,就是这种情况。
因此,只有当我们在尝试“重写”类的公共方法时尝试添加类型参数时,原始问题的第二个条件才会发挥作用。我尝试了以下简单示例来测试这一点,使用未使用的类型参数:Object
public class Foo {
@Override
public <T> boolean equals(Object obj) {
return true;
}
}
当然,此类不会编译,因为该方法实际上不会重写该方法,因此会与该方法发生冲突。但是,由于使用注释,我仍然收到编译器错误。我假设此示例满足第二个使用条件是错误的吗?或者编译器是否生成此错误,尽管不需要这样做?equals
@Override
@Override