Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 克隆包含实数类型的集合_Java - Fatal编程技术网

Java 克隆包含实数类型的集合

Java 克隆包含实数类型的集合,java,Java,有可能实现这种方法吗 public <T> Set<T> cloneSet(Set<T> original); public Set cloneSet(Set-original); 结果集必须与原始集的类型相同(例如,如果原始集是树集,则结果集也是树集。您可以使用反射进行此操作。请参见此示例: public class CloneTest { public static <T> Set<T> clone(Set<T&

有可能实现这种方法吗

public <T> Set<T> cloneSet(Set<T> original);
public Set cloneSet(Set-original);

结果集必须与原始集的类型相同(例如,如果原始集是树集,则结果集也是树集。

您可以使用反射进行此操作。请参见此示例:

public class CloneTest {

    public static <T> Set<T> clone(Set<T> set) {
        try {
            Set<T> cloned = set.getClass().newInstance();
            cloned.addAll(set);
            return cloned;
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        Set<String> test = new TreeSet<>();
        test.add("asd");
        printClone(clone(test));
        printClone(clone(new HashSet<>(test)));
    }

    public static void printClone(Set<?> set) {
        System.out.println(set.getClass().getSimpleName());
        set.forEach(System.out::println);
    }

}
它使用类信息来创建一个新实例。假设我们知道它是一个集合,那么我们可以调用addAll来添加所有元素。但是这些元素没有被克隆,所以它们是相同的引用

这是因为集合上有一个默认构造函数。我相信如果有一个非空构造函数,
newInstance
方法可能会失败

这是一个有趣的小例子,但我不会在生产中使用:)


Artur

可能会在集合中调用
clone
?如果您仅限于标准Java库中的实现,那么我认为它们都有一个
clone
方法。@john16384我一开始是这么想的,但集合不是Cloneables您可以先将集合转换为
Cloneable
,但它不能适用于所有集合。@john16384如果我尝试这样做,则会出现编译错误,即使对于包含不可比较类型实例的树集,这也将无法返回“克隆”-即您使用带比较器的ctor创建树集。
TreeSet
asd
HashSet
asd