アノテーションのJavadocを読ん@Override
で、次のルールに出会いました。
メソッドにこの注釈型の注釈が付けられている場合、次の条件の少なくとも 1 つが保持されない限り、コンパイラはエラー メッセージを生成する必要があります。
- メソッドは、スーパータイプで宣言されたメソッドをオーバーライドまたは実装します。
- このメソッドには、Object で宣言されたパブリック メソッドのシグネチャとオーバーライド等価なシグネチャがあります。
最初の点についてははっきりしていますが、2 番目の点についてはよくわかりません。
「オーバーライド同等」とはどういう意味ですか? この点で、public メソッドはどのようにObject
特別なのですか? そして、なぜこれが最初の基準でカバーされないのですか?
さらに、これは Java 7+ ドキュメントにのみ当てはまります。Java 6 docは、オーバーライド等価性について何も述べていません。変更の理由
アップデート:
JLS (セクション 8.4.2 ) をさらに調べた後、オーバーライド等価性の次の説明を見つけました。
メソッドの署名
m1
は、次のいずれかの場合、メソッドの署名のサブ署名です。m2
m2
m1
、またはと同じ署名を持っています- の署名は、 の署名の消去 ( §4.6 )
m1
と同じです。m2
2 つのメソッド シグネチャ
m1
とm2
は、 のサブシグネチャであるか、 のサブシグネチャである場合、オーバーライド同等です。m1
m2
m2
m1
私が知る限り、これは最初の質問 (「それはどういう意味ですか?」) と 3 番目の質問 (「最初の条件がこれをカバーしないのはなぜですか?」) に答えています。
私が正しく理解していれば(そうでない場合はお知らせください!)、2つのメソッドがオーバーライド同等であり、元の質問の最初の条件に該当しないケースが1つだけあります。これは、サブクラス メソッドのシグネチャの消去がスーパークラス メソッドのシグネチャと同じであるが、その逆ではない場合です。
Object
したがって、元の質問の 2 番目の条件は、クラスのパブリック メソッドを「オーバーライド」しようとするときに型パラメーターを追加しようとしたときにのみ有効になります。これをテストするために、未使用の型パラメーターを使用して次の簡単な例を試しました。
public class Foo {
@Override
public <T> boolean equals(Object obj) {
return true;
}
}
もちろん、このクラスはコンパイルされません。メソッドは実際にはメソッドをオーバーライドせず、equals
メソッドと衝突するからです。しかし、@Override
注釈を使用するとコンパイラ エラーも発生します。この例が 2 番目の使用条件を満たしていると仮定するのは間違ってい@Override
ますか? または、必要がないにもかかわらず、コンパイラがこのエラーを生成していますか?