簡體   English   中英

Java中的通用LinkedList克隆

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM