1

私は Functional Interface の初心者で、今日はいくつかのチュートリアル サイトから学んでいます。質問があります。あなたの提案を提供し、私を導いてください。

以下のコードに質問があります。

@FunctionalInterface
interface Demo {
    Object clone();   // protected
    //int hashCode();              // public
    //boolean equals(Object c); // public
    //public void wait(); // final so we cannot override this one.
}

オブジェクト クラスは、すべての Java クラスの親です。ここでwait()メソッドは、これが最終的なものであるため、オーバーライドされていないと言っています。したがって、Demo インターフェイスも Object クラスの子であることを意味します (一般的に言えば)。

> @FunctionalInterface means interface with exact one method declaration.

質問:オブジェクト clone(); のときにコードが機能するようになりました。メソッドはコメントされていません。つまり、このメソッドはインターフェイス Demo で宣言されています。しかし、その実装をクリックすると、Object クラスの clone() メソッドに移動します。

clone() メソッドをコメントし、equals() メソッドのコメントを外すと、コンパイル時エラーが発生します。インターフェイスは FunctionalInterface ではありません。どうして ??????なぜ clone() メソッドとの機能的なインターフェースなのか。

clone() が保護されているとは言わないでください。クローンが Object クラスで保護されている場合はどうなりますか。説明してください。

ありがとう、澤井

4

2 に答える 2

2

clone()保護されているからです。それを言わないように言われたことは知っていますが、それが答えなのでとにかく言います。

http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.8具体的に言うと:

インターフェイス I の場合、クラス Object のパブリック インスタンス メソッドと同じシグネチャを持たない、I のメンバーである抽象メソッドのセットを M とします。次に、次の両方が真であるメソッド m が M に存在する場合、I は関数型インターフェイスです。

m の署名は、M のすべてのメソッドの署名のサブ署名 (§8.4.2) です。

m は、M のすべてのメソッドに対して戻り値の型を代入できます (§8.4.5)。

public instanceと表示されていることに注意してください。のコメントを外した場合、 inは保護されたインスタンスメソッドであるため、これは public インスタンス メソッドと同じ署名clone()を持たないメソッドです。したがって、メソッドは条件を満たします。は の public インスタンス メソッドであるため、について同じことを言うことはできません。つまり、このルールによって参照されるセットMは空であるため、このセットに含まれている必要があるメソッドmは存在できません。clone()Objectclone()equals()equals()Object

JLS の 2、3 段落下にコメントがあり、なぜ彼らがclone()異なる扱いをすることにしたのかを説明しています。

于 2016-11-22T06:28:54.053 に答える
0

public boolean equals(Object c)に既に存在するためObjectDemo新しいメソッドは宣言しません。になるにはFunctionalInterface、メソッドを 1 つだけ宣言する必要があります。

代わりに を宣言すると、元のメソッドが であるpublic Object clone()ため、新しいメソッドになります。したがって、 と見なすことができます。ObjectprotectedFunctionalInterface

于 2016-11-22T06:26:07.503 に答える