rion0726ittoti
@rion0726ittoti

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

JavaGold 関数型インタフェースについて

解決したいこと

JavaGoldを取得目指して学習しています。紫本(JavaプログラマGoldSE11)の問題でわからないことがあります。
解決方法を教えて下さい。

発生している問題

equal()引数なし→コンパイル成功

関数型インタフェースを明示しています。下記のコードでデフォルトメソッドとして、equals()メソッドを定義しています。この場合はエラーは発生しないようです。

@FunctionalInterface
interface Test<T>{
	default  void equals(){}
	void task(T t);
}

equal(Object obj)引数あり→エラー

しかし、下記のようにequals(Object obj)として、定義するとエラーになるようです。引数があるとエラーになるようです。

@FunctionalInterface
interface Test<T>{
	default  void equals(Object obj){}
	void task(T t);
}

疑問点

上記のコードの解説では、Objectクラスのメソッドであるequals(Object obj),hasCode(),toString()メソッドはデフォルトメソッドとして、定義不可でequals()で引数がないなら定義可能と記載されています。
また、同書のインタフェースの解説では、equals(),hasCode(),toString()メソッドはデフォルトメソッドとして、定義不可と記載されています。

質問

上記の疑問点から

①なぜequals()メソッドだけ引数なしなら定義可能で、hasCode(),toString()メソッドは引数なしでもダメなのか。

②インタフェースでは、equals(),hasCode(),toString()メソッドはデフォルトメソッドとして、定義不可と記載されているが、上記のコードではなぜequals()メソッドは定義可能なのか。

自分で解説を読んだり、調べてみましたが、理解に至っていません。ご協力をお願いします。

0

1Answer

まずルールとしてインターフェース内でjava.lang.Objectクラスから継承されたメソッドのオーバーライドは禁止されています。
(すべてのJavaクラスは暗黙的にjava.lang.Objectクラスのメソッドを継承しています)

equalsメソッドの引数がなければ定義可能な理由ですが、そもそもequalsメソッドは比較するためメソッドなので引数無しの定義はされていません。
よって引数無しの定義はシグネチャが異なり、オーバーライドではないため宣言可能というわけです。

// Objectクラスの定義
public boolean equals(Object obj) {
        return (this == obj);
    }
1Like

Comments

  1. @rion0726ittoti

    Questioner

    ご回答ありがとうございます。
    シグネチャが異なるため、java.lang.Objectクラスとは異なるメソッドとなり、定義可能になるという認識ですかね。

  2. @rion0726ittoti

    Questioner

    ありがとうございます!
    納得がいきました!
    すごくわかりやすかったです!

Your answer might help someone💌