2011-02-23 60 views
3

我,也許幼稚,克隆一個ArrayList(矢量置換)解決方案是如何克隆一個容器(f.e.ArrayList)*容易*?使用.clone()是錯誤的嗎?

ArrayList<Double> alBis = (ArrayList<Double>) alOriginal.clone(); 

考慮到,因爲數組包含不可變的雙打,我不需要 克隆他們,但只集裝箱。

由於clone()返回一個Object,我放在那裏,但是然後 -Xlint抱怨說這是一個未經檢查的強制轉換。

那麼,現在呢?用supressWarnings忽略它?創建一個新的ArrayList 並複製原始元素與緊湊的?任何類似於 Arrays.copyOf()的庫方法?

我讀Unchecked cast warning但接受的方式是令人難以置信的複雜。

回答

13

clone()有重大缺陷,請參閱this Question以供參考。不要使用它!

相反,所有標準集合都有複製構造函數。使用:

List<Double> original = // some list 
List<Double> copy = new ArrayList<Double>(original); 

參考:

+0

「的clone()有重大缺陷」 你能不能解釋一下?我沒有注意到任何鏈接問題的答案。 – adamax 2011-02-23 17:53:30

+0

閱讀Joshua Bloch的Effective Java – 2011-02-23 17:59:48

+0

當考慮使用克隆與拷貝構造函數時,需要考慮如果傳入的對象是從預期的類派生的類的時候會發生什麼。在克隆的情況下,新對象將與原始對象相同;在複製構造函數的情況下,它將是預期的類。在某些情況下,一種行爲是正確的,另一種行爲是錯誤的,在不同情況下需要不同的行爲。 – supercat 2011-02-23 18:17:57

4

這是錯誤的使用.clone()?

只要有可能就應該避免。這是一個過時的,設計不好的fundamentally broken API。像@Sean建議的那樣更好地使用複製構造函數。