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