1

私はクラスを持っています:

public class CounterBag<T extends Additive<T> & Cloneable & Serializable> {
    private T cntData;

    // c'tor, accessors equals and hashcode... 
    public T getCounterData() {
       return cntData;
    }
}

他のクラスServiceにはタイプのメンバーがありSet<CounterBag>ます。ここで、Service特定のメンバーを検索して、そのメンバーCounterBagのクローンを返します。cntData

クラスのルックアップメソッド内で、セット内のServiceのインスタンスを検出し、次のことを試みます。CounterBag

return counterBag.getCounterData().clone();

clone()見えないようです。

clone()見えるようにするために何をする必要があるのだろうか?

4

3 に答える 3

2

Cloneableメソッドを(再)宣言するのではなくclone、単にから継承されObjectます。つまり、のインスタンスTがの目に見える実装を持っていることは知られていないということですcloneCloneableを宣言する独自のサブインターフェイスを定義しclone、それをの境界として使用しTます。さまざまなコンクリートを制御できないためにできない場合はT、反射に頼る必要があります。:(

于 2012-05-23T09:14:55.297 に答える
1

cloneメソッドはデフォルトでObjectクラスで定義され、クラスのprotectedメンバーです。

Objectクラスから:

protected native Object clone() throws CloneNotSupportedException;

したがって、クラスcloneでメソッドを定義する必要があります。CounterBagその後、それだけが利用可能になります。

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

パッケージから利用できるようにするには、パブリックメソッドとして定義する必要があります。

于 2012-05-23T09:10:21.607 に答える
1

Ttypeパラメーターとして渡されるクラスがCloneable、適切な可視性で実装されていることを確認してください。次に例を示します。

@Override
public Object clone() {
    try {
        return super.clone();
    } catch (Exception e) {
        // either handle the exception or throw it
        return null;
    }
}

メソッドはクラス内でマークされていることを覚えておいてくださいclone() 。独自のクラスでメソッドを表示する必要があります。protectedObject

于 2012-05-23T09:10:49.160 に答える