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