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