2017-04-05 67 views
0

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

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

所得集必須是相同類型與原始集(例如,如果原來是一個TreeSet,然後將得到的集也是一個TreeSet。

+0

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

+0

如果您僅限於標準Java庫的實現,那麼我認爲它們都有一個'clone'方法。 –

+0

@ john16384這就是我第一次想到的,但Set不可複製 – aurya

回答

0

可以使用反射該見這個例子:

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