0
是否可以實現此方法?克隆包括實型的集合
public <T> Set<T> cloneSet(Set<T> original);
所得集必須是相同類型與原始集(例如,如果原來是一個TreeSet,然後將得到的集也是一個TreeSet。
是否可以實現此方法?克隆包括實型的集合
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
方法可能會失敗。
這是一個有趣的小例子,但我不會用在生產:)
阿圖爾
現在是最好的解決方案,謝謝:) – aurya
或者叫上設置的'clone'? – john16384
如果您僅限於標準Java庫的實現,那麼我認爲它們都有一個'clone'方法。 –
@ john16384這就是我第一次想到的,但Set不可複製 – aurya