8

コードビハインド:

class A implements Cloneable
{
    int i, j;

    A(int i, int j)
    {
        this.i = i;
        this.j = j;
    }

    A()
    {
    }
}

class B extends A
{
    int l, m;

    B()
    {
    }

    B(int l, int m)
    {
        this.l = l;
        this.m = m;

    }

    public static void main(String l[])
    {
        A obj = new A(1, 2);
        B obj1 = (B) obj.clone(); // ERROR
    }
}

あるオブジェクトのフィールドをまったく別のオブジェクトに割り当てようとしているので、クローンの意味に違反していることはわかっています。しかし、私を混乱させているのはエラーステートメントです。

ステートメント: 「エラー: clone() はオブジェクトへのアクセスを保護しています」

A を拡張するclone()と、B も利用できるようになりますか? そうであれば、i と j の値を l と m にもコピーする必要がありますか? これは可能ですか?

4

2 に答える 2

8

clone()は保護されたメソッドであり、サブクラスでアクセスできるようにするには、publicアクセスでオーバーライドします。

class A implements Cloneable{
    .....
    @Override
    public Object clone() throws CloneNotSupportedException{
      return super.clone();
    }
}
于 2012-09-22T07:36:05.153 に答える
3

Cloneableの Javadoc から

慣例により、このインターフェイスを実装するクラスは、パブリック メソッドで Object.clone (保護されている) をオーバーライドする必要があります。このメソッドのオーバーライドの詳細については、Object.clone() を参照してください。

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

CloneJava の初期の設計の 1 つであり、欠陥があります。

When a method is protected, it can only be accessed by the class itself, subclasses of the class, or classes in the same package as the classアクセスについて

したがって、あなたがやっている方法でAおよびBクラスでアクセスできますが、たまたま同じパッケージにいる場合にのみ可能ですjava.lang

内部でこのようなメソッドを提供できますA

public A copy() throws CloneNotSupportedException {
        return (A) clone();
    }

正しい実装

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    };

また、親は子のタイプではないため、A から B へのキャストは機能しないことに注意してください。子は親の型なので、B から A へのキャストは機能します。

于 2012-09-22T08:44:04.663 に答える