2

次のことができない理由がわかりません。

interface MyInterface extends Cloneable {}

class myClazz implements MyInterface {
    public Object clone() { return null; }
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.clone(); // IMPOSSIBLE
    }
}

しかし、これはうまくいきます

interface Misc{
    public void testM();
}

interface MyInterface extends Misc{}

class myClazz implements MyInterface {
    public void testM() {}
}

class test{
    public static void main(String[]a){
        MyInterface o = new myClazz();
        o.testM(); // OK
    }
}

Cloneableはどうなりますか?

ありがとう、

4

3 に答える 3

7

インターフェイスにはCloneableメソッドがありません。これは、基本メソッド( である) がチェックする
単なるマーカー インターフェイスです。Object.cloneprotected

メソッドが必要な場合はclone、自分で宣言する必要があります。

于 2011-05-10T15:16:46.520 に答える
6

これは、Cloneableインターフェースが通常のインターフェースではなく、多かれ少なかれ、それcloneを実装するクラスのメソッドが正当で実際に機能していることを JVM に保証するタグ付けインターフェースであるためです。

ドキュメントに記載されているように、Cloneableインターフェイスはメソッドのシグネチャを宣言していませんclone。そのメソッドは、クラスから宣言するすべてのクラスで本質的に継承されますObjectprotected、デフォルトでは継承されます。これが、宣言するpublic中間インターフェイスで作成することにより、この制約を弱める必要がある理由です。MyInterface

Java doc にあるこのヒントを見てください。

このインターフェイスには clone メソッドが含まれていないことに注意してください。したがって、このインターフェースを実装しているという事実だけでは、オブジェクトを複製することはできません。clone メソッドをリフレクティブに呼び出しても、成功する保証はありません。

于 2011-05-10T15:19:29.647 に答える
1

clone() が で公開されていないためObjectです。インターフェイスで宣言するpublic Object clone()と、つまり、最初の例を 2 番目のように作成すると、最初の例が機能します。

于 2011-05-10T15:16:11.560 に答える