3

コピーコンストラクターを持つジェネリックコンテナーを作成しようとしています。コード化したのにcloneメソッドの使用に問題があります。これまでのところ、次のようになっています。

public class MyBox<T> 
{
    private List<T> list;

    public MyBox()
    {
        list = new ArrayList<T>();
    }


    public void add(T item )
    {
        list.add(item);
    }

    public MyBox(MyBox<T> other) throws CloneNotSupportedException //this is giving me trouble
    {
        for(T item : other.list)
        {
            list.add((T) item.clone());
        }
    }
}

コピーコンストラクターを機能させるにはどうすればよいですか?

4

4 に答える 4

3

通常、アイテムのクローンを作成する必要はありません。

public MyBox(MyBox<T> other)
{
    list = new ArrayList<T>(other.list);
}

コレクションAからコレクションBにアイテムを追加すると、そのアイテムは2つのコレクションAとBの両方から参照されるようになります。

于 2012-05-18T14:52:52.520 に答える
0

残念ながら、Javaでは、オブジェクトのクローンを作成する一般的な方法はありません。一部のクラスには、clone()クローンを作成できるパブリックメソッドがありますが、パブリックメソッドとの共通のスーパークラスまたはインターフェイスはありませんclone()。(実際、共通のインターフェースがないため、クラスはそれを呼び出す必要はありません。clone()名前を付けることもcopy()できます。)リフレクションを使用して、パブリックclone()メソッドがあるかどうかを確認できますが、それはやり過ぎかもしれません。

于 2012-05-18T21:29:01.493 に答える
0

ジェネリックをClonableに制限するのはどうですか。そうすれば、アイテムのクローンが許可されることは確実です。

public class MyBox<T extends Clonable> {
   ...
于 2012-05-18T14:50:35.910 に答える
0
public MyBox(MyBox<T> other) 
{
      this.list = new ArrayList<T>(other.getList()); 
}

ただし、この場合、最初にリストにゲッターを追加する必要があります。

UPD。これは浅いコピーになります。

于 2012-05-18T14:52:37.930 に答える