Java中的通用LinkedList克隆

Java中的通用LinkedList克隆,java,generics,Java,Generics,我想克隆任何LinkedList,不管它是否包含可以作为原始包装的内容。我知道这可能是一个深度递归调用,以获得真正的深度克隆,但我只需要一个级别的克隆。我无法编译以下代码: <T> LinkedList<T> deepCloneOneLevel (final LinkedList<T> input){ if(input != null){ LinkedList<T> clone = new Linked

我想克隆任何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;
    }
LinkedList DeepCloneLevel(最终LinkedList输入){
如果(输入!=null){
LinkedList clone=新建LinkedList();
对于(T:input){
clone.add(t.clone());//错误:clone()具有受保护的访问权限
}
返回克隆;
}
返回null;
}
由于
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;
}
LinkedList DeepCloneLevel(最终LinkedList输入){
如果(输入!=null){
LinkedList clone=新建LinkedList();
for(T:输入){
clone.add(SerializationUtils.clone(t));
}
返回克隆;
}
返回null;
}

如评论中所述,Java的Cloneable不是一种非常友好的克隆对象的方法。因此,您可能需要定义
Cloneable
接口,并确保

interface MyClone<T>{
  T clone();
}

如果您的平台还没有
功能
,您可以轻松编写自己的,或者使用番石榴的功能。

您不能。并非所有对象都是可克隆的。在更高的层次上,您试图实现什么?对代码的小注释:for循环可以简化为使用Java 8的
collect()
调用。有关工作示例,请参阅。但是,正如JB Nizet所说,这需要该列表中的所有对象实现可克隆性。一般来说,我更喜欢显式复制构造函数,而不是使用
.clone
。基本原理之所以如此,是因为
Cloneable
是一个标记接口,在代码级别上不能保证使用
public
clone()
方法。如果它遵循规范,它应该有这样的功能,但是如果你查看
Cloneable
的实际源代码,你会发现一个巨大的Javadoc后面跟着一个空的
接口。相反,它只是作为受保护的Object.clone()方法的标记,不引发异常。您最好定义自己的接口。使用这种方法,我可能无法处理整数和字符串类型,对吗?接受这个答案,尽管我不能完全使用它,因为函数在Android中不可用/Java7@SlowAndSteady你可以很容易地定义你自己,没有?我会在这里使用
UnaryOperator
而不是
Function
。我以前从未使用过Function和UnaryOperator-我想是时候阅读了!
 <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;
}
<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;
}