克隆包括实型的集合
问题描述:
是否可以实现此方法?克隆包括实型的集合
public <T> Set<T> cloneSet(Set<T> original);
所得集必须是相同类型与原始集(例如,如果原来是一个TreeSet,然后将得到的集也是一个TreeSet。
答
可以使用反射该见这个例子:
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);
}
}
这将打印:
TreeSet
asd
HashSet
asd
它使用类信息来创建一个新实例。鉴于我们知道它是一个集合,我们可以调用addAll来添加所有元素。这些元素虽然没有被克隆,所以它们是相同的参考。
这是可行的,因为在集合上有一个默认构造函数。我相信如果你有一个非空的构造函数,那么newInstance
方法可能会失败。
这是一个有趣的小例子,但我不会用在生产:)
阿图尔
+0
现在是最好的解决方案,谢谢:) – aurya
或者叫上设置的'clone'? – john16384
如果您仅限于标准Java库的实现,那么我认为它们都有一个'clone'方法。 –
@ john16384这就是我第一次想到的,但Set不可复制 – aurya