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

问题描述 投票:-1回答:1

假设我有收藏,存储在

Collection<V> member;

或者在

C member;

如何克隆这个类同时克隆这个成员?

java generics interface clone
1个回答
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的任何方法的破坏者。

© www.soinside.com 2019 - 2024. All rights reserved.