克隆包括实型的集合

问题描述:

是否可以实现此方法?克隆包括实型的集合

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

所得集必须是相同类型与原始集(例如,如果原来是一个TreeSet,然后将得到的集也是一个TreeSet。

+0

或者叫上设置的'clone'? – john16384

+0

如果您仅限于标准Java库的实现,那么我认为它们都有一个'clone'方法。 –

+0

@ john16384这就是我第一次想到的,但Set不可复制 – aurya

可以使用反射该见这个例子:

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