35

Java 8 ラムダを学習していて、ラムダ式に使用する Comparator のどのメソッドをコンパイラがどのように認識しているのか疑問に思っていますか? SAMインターフェースじゃないみたい?2 つの抽象メソッドがあります。

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}
4

3 に答える 3

54

equals()抽象メソッドではありません。このメソッドは をオーバーライドObject.equals(Object)し、コンパレータが を実装する方法を説明する javadoc をメソッドにアタッチできるようにするためだけに存在しますequals()

FunctionalInterface の javadoc を参照してください。

インターフェースが java.lang.Object の public メソッドの 1 つをオーバーライドする抽象メソッドを宣言する場合、インターフェースの実装には java.lang.Object または他の場所からの実装があるため、それもインターフェースの抽象メソッド数にはカウントされません。

于 2014-05-18T12:24:07.480 に答える