如何克隆未知类型的集合?

时间:2017-12-28 19:01:38

标签: java generics interface clone

假设我有收藏,存储在

Collection<V> member;

C member;

如何克隆此类并同时克隆此成员?

1 个答案:

答案 0 :(得分:0)

  

如何克隆此类并同时克隆此成员?

我假设你重写了clone方法。因此,您可以使用提供的member的runtimeType来获取新实例:

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所提到的,集合甚至可以是不可变的。例如。 addAll()来电失败。

要克服上述肮脏方式,在创建Supplier<C>实例时可能需要MyObject,您可以根据需要创建自己的收藏:

private final Supplier<C> factory;

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

仅在首次使用时创建member。通过调用factory.get()

这样,您可以在克隆对象时安全地创建member变量。但是,仍然存在可变性的情况,这可能是将值从member复制到clone.member的任何方法的破坏者。

相关问题