[英]Generic LinkedList clone in Java
我想克隆任何LinkedList,無論它是否包含可以是原始包裝器的東西。 我知道它可以是一個深度遞歸調用來獲得真正的深度克隆 - 但我只需要一個級別的克隆。 我無法編譯以下代碼:
<T> LinkedList<T> deepCloneOneLevel (final LinkedList<T> input){
if(input != null){
LinkedList<T> clone = new LinkedList<>();
for (T t: input){
clone.add(t.clone()); //error : clone() has protected access
}
return clone;
}
return null;
}
正如評論中所提到的,Java的Cloneable不是克隆對象的非常友好的方法。 因此,您可能需要定義Cloneable
接口,並確保
interface MyClone<T>{
T clone();
}
並在您的代碼中使用它
<T extends MyClone<? super T>> LinkedList<T> deepCloneOneLevel (final LinkedList<T> input){
if(input != null){
LinkedList<T> clone = new LinkedList<>();
for (T t: input){
clone.add(t.clone());
}
return clone;
}
return null;
}
並且MyClone
實現知道淺拷貝是否足夠或需要深拷貝
但是,如果該類型沒有實現MyClone
怎么MyClone
? 好問題。 我們可以添加一個clone
“工廠”的重載。
<T> LinkedList<T> deepCloneOneLevel (final LinkedList<T> input, Function<T,T> factory){
if(input != null){
LinkedList<T> clone = new LinkedList<>();
for (T t: input){
clone.add(factory.apply(t));
}
return clone;
}
return null;
}
如果您的平台還沒有Function
,您可以輕松編寫自己的功能,或使用Guava的功能。
由於clone()
方法在java世界中是一個很大的混亂,一種解決方案可能是使用apache commons SerializationUtils。 它使用序列化來復制對象,因此速度很慢。 更糟糕的是,如果您的類包含不支持序列化的字段,您將遇到麻煩。 這是一個例子:
<T extends Serializable> LinkedList<T> deepCloneOneLevel (final LinkedList<T> input) {
if (input != null) {
LinkedList<T> clone = new LinkedList<>();
for (T t : input){
clone.add(SerializationUtils.clone(t));
}
return clone;
}
return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.