「Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object.」への対応

はじめに

Lombokの@Dataのアノテーションを親クラス・子クラスの両方に付けている際に、にビルド時に以下の警告メッセージが表示されます。

Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.

↓和訳

equals/hashCode の実装を生成しているが、superclass を呼び出していない
このクラスは java.lang.Object を継承していないにもかかわらずです
もしこれが意図的なものであれば、型に '@EqualsAndHashCode(callSuper=false)' を追加してください

https://stackoverflow.com/questions/56583423/generating-equals-hashcode-implementation-but-without-a-call-to-superclass-even

本記事では、上記エラーの対応について紹介します。

警告の内容

@Dataを定義した抽象クラスを継承した子クラスは、java.lang.Objectを直接継承していないことになります。
そのため、equlesメソッドやtoStringメソッドはjava.lang.Objectのものを利用することができず、
デフォルトでは開発者が自分で実装する必要がある、ということ示した警告です。

警告を回避する方法

回避するためには継承したクラスで以下のannotationを追加することで自前での実装を避けることができます。

  • @EqualsAndHashCode(callSuper=true)
  • @ToString(callSuper=true)

上記を設定することで、スーパークラスであるjava.lang.Objectを利用することができます。

おわりに

Lombokの@Dataのアノテーションを親クラス・子クラスの両方に付けている際の警告への対応を紹介しました。 本記事がJavaエンジニアの参考になれば幸いです。