はどのようにも、このメンバーをクローニングして、このクラスのクローンを作成する未知の型のコレクションを複製するには?
C member;
に
Collection<V> member;
または
に保存されている、私はコレクションを持っていると仮定しますか?はどのようにも、このメンバーをクローニングして、このクラスのクローンを作成する未知の型のコレクションを複製するには?
C member;
に
Collection<V> member;
または
に保存されている、私はコレクションを持っていると仮定しますか?このメンバーを複製するにはどうすればよいですか?
私はあなたが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
に値をコピーするためのアプローチの中断者である可能性があります。
'C'はジェネリック型ですか? –
「クローン」とはどういう意味ですか?宣言型をコピーしますか?コレクションをコピーしますか?コレクションをディープコピーしますか? – n247s
'Collection'は' clone() 'をサポートしていません。基本型はそれをサポートしていないので運が悪いと思います。前もって計画を立てて、あなたのコードが正しいタイプを使用して仕事を完了させることを確認することが最善です。 'collection.addAll()'はコレクションを複製するのではなく、コレクションをコピーします。これで十分です。そして、常に反射があります。がんばろう。 – markspace