2016-04-27 23 views
7

Java 8でデフォルトのメソッドを作成するときに、ある特定のObjectメソッドは、デフォルトのメソッドから呼び出すことができません。たとえば:特定のObjectメソッドをデフォルトメソッドから呼び出すことができないのはなぜですか?

interface I { 
    default void m() { 
     this.toString(); // works. 
     this.clone(); // compile-time error, "The method clone() is undefined for the type I" 
     this.finalize(); // same error as above. 
    } 
} 

clone()finalize()が許可されていないObjectからの唯一の方法であると思われます。偶然にも、これは保護されるObjectの唯一のメソッドですが、この問題は、デフォルトのメソッドに特に関係します。java.lang.Objectを継承するクラスに継承されるためです。これの理由は何ですか?

+1

[なぜjava.lang.Objectでclone()メソッドが保護されていますか?](http://stackoverflow.com/questions/1138769/why-is-the-clone-method-protected-in- java-lang-object) – Sean

+1

@ SPrashad私は同意しません。その質問は、インターフェイスのデフォルトメソッドで呼び出し可能でない理由とは関係ありません。 – rgettman

答えて

8

protectedのメソッドがdefaultメソッドのインタフェースで利用できないことは偶然ではありません。

Section 9.2 of the JLS状態:

インターフェースは直接的なスーパを有していない場合、インタフェースは暗黙署名s、戻り型rpublic abstract部材方法mを宣言し、各publicインスタンスメソッドに対応する句tをスローm署名がsで、戻り値の型がrであり、メソッドが同じシグネチャ、同じ戻り値の型および互換性を持たない限り、tObjectで宣言されていますible throws句は、インターフェイスによって明示的に宣言されます。

インタフェースはObjectから何かを継承しませんが、それは暗黙のうちにすべてのpublicObjectメソッドを宣言します。これにはprotectedメソッドは含まれません。これはなぜclonefinalizeが呼び出せないのかを説明しています。インタフェースでは宣言されません。

+0

興味深い。私は 'default'メソッドを宣言したときに、' Object'から継承していないことに気づいていませんでした。しかし、 'default'メソッドを直接呼び出すことはできません。直接または間接的にインタフェースを実装するクラスを持つオブジェクトに対して呼び出される必要があります。そのクラスは 'Object'から継承することは間違いありません。したがって、これを許すことは安全でなければなりません。面白いデザインの決定。 –

+2

@RaffiKhatchadourianちょうど明確にするために、デフォルトメソッドがあるかどうかに関わらず、 'Object'から継承しない** **インターフェースはありません。彼らは単純にしません。 'Object'から継承する際の問題は、' toString() 'メソッドが' I'を実装するクラスによってオーバーライドされる可能性があることです。インターフェースに継承されたものか、インターフェースを実装しているクラスのものですか? – biziclop

+0

@biziclopもし、インタフェース**が決して 'Object'から継承していない場合、' Object o = i; 'は' iはコンパイル時に型の合法的な型を持っていますか?実際、これはhttp://stackoverflow.com/questions/6056124/do-interfaces-inherit-from-object-class-in-javaに関連しているようです。 –

関連する問題