2017-12-28 38 views
-1

はどのようにも、このメンバーをクローニングして、このクラスのクローンを作成する未知の型のコレクションを複製するには?

C member; 

Collection<V> member; 

または

に保存されている、私はコレクションを持っていると仮定しますか?

+0

'C'はジェネリック型ですか? –

+0

「クローン」とはどういう意味ですか?宣言型をコピーしますか?コレクションをコピーしますか?コレクションをディープコピーしますか? – n247s

+1

'Collection'は' clone() 'をサポートしていません。基本型はそれをサポートしていないので運が悪いと思います。前もって計画を立てて、あなたのコードが正しいタイプを使用して仕事を完了させることを確認することが最善です。 'collection.addAll()'はコレクションを複製するのではなく、コレクションをコピーします。これで十分です。そして、常に反射があります。がんばろう。 – markspace

答えて

0

このメンバーを複製するにはどうすればよいですか?

私はあなたがcloneメソッドを上書きしていると仮定します。

public class MyObject<V, C extends Collection<V>> { 

    private C member = ...; 

    @Override 
    public MyObject clone(){ 
     MyObject clone = new MyObject(); 
     if(member != null){ 
      try { 
        clone.member = member.getClass().newInstance(); 
        clone.member.addAll(member); 
      } catch(InstantiationException | IllegalAccessException ignore){} 
     } 

     // clone other properties 

     return clone; 
    } 
} 

しかし、あなたは Cは、デフォルトコンストラクタを持っているか@shmoselで述べたように、コレクションにもなり得ることを保証することはできませんので、これは非常に汚れている:だから、新しいインスタンスを取得するために memberの提供runtimeTypeを使用することができます不可能。例えば。 addAll()呼び出しが失敗します。

private final Supplier<C> factory; 

public MyObject(Supplier<C> factory){ 
    this.factory; 
} 

そして唯一それが初めてであるときmemberを作成する:あなたが望むように、あなたが自分のコレクションを作成することができます方法MyObjectのインスタンスを作成するときにSupplier<C>を必要とする可能性がある上記の汚いやり方を克服するために

中古。 factory.get()を呼び出します。

このようにして、オブジェクトをクローンするときにmember変数を安全に作成します。しかし、おそらく、memberからclone.memberに値をコピーするためのアプローチの中断者である可能性があります。

+0

それは変更可能です。 – shmosel

+0

@shmoselちょうど私は答えにそれを入れます – Lino

関連する問題