[Lambda] Java 8における "機能インタフェース"の正確な定義


Answers

Q.しかしComparatorインターフェイスでは、compare()とequals()メソッドは抽象メソッドです。つまり、抽象メソッドが2つあります。 したがって、定義でインターフェイスに厳密に1つの抽象メソッドを持たせる必要がある場合、これはどのように機能しますか? 私はここで何が欠けていますか?

A.

機能インタフェースは、その "機能インタフェース"状態に影響を与えずに、equals()などのObjectによって定義されたすべてのパブリックメソッドを指定できます。 public Objectメソッドは、機能インタフェースのインスタンスによって自動的に実装されるため、機能インタフェースの暗黙のメンバと見なされます。

Question

最近私はJava 8の開発を開始しました。Javaのラムダ式の実装に不可欠な「機能インタフェース」という概念を理解することはできません。 Javaのラムダ関数にはかなり包括的なガイドがありますが、私は機能インタフェースの概念を定義する章についています 。 定義は次のようになります。

より正確には、機能インタフェースは、厳密に1つの抽象メソッドを持つインタフェースとして定義されます。

その後、彼は例に進み、その1つはComparatorインターフェースです:

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

私はComparator引数の代わりにラムダ関数を使うことができることをテストできました。それはCollections.sort(list, (a, b) -> ab) )です。

しかしComparatorインターフェースでは、 compareequals両方のメソッドが抽象メソッドであるcompare2つの抽象メソッドがあります。 したがって、定義でインターフェイスに厳密に1つの抽象メソッドを持たせる必要がある場合、これはどのように機能しますか? 私はここで何が欠けていますか?




Javaのドキュメントでは、

Object.equals(Object)をオーバーライドしないことは常に安全です。 ただし、このメソッドをオーバーライドすると、プログラムによって2つの異なるコンパレータが同じ順序を課すことをプログラムが判別できるようにすることによって、パフォーマンスが向上する場合があります。

コンパレータは特別でしょうか? たぶん、それはインターフェイスであるにもかかわらず、 compare()を呼び出すequals()デフォルト実装が何とかありますか? アルゴリズム的には、それは簡単です。

私は、インターフェイスで宣言されたすべてのメソッドが抽象的な(つまり、デフォルト実装なし)と考えていました。 しかし、多分私は何かを逃しています。