1 回答
TA贡献1831条经验 获得超9个赞
因为该clone方法被标记为protected在Object类上,所以通常不能在任意对象上调用此方法。该clone()方法背后的想法是支持它的类将覆盖该方法,将其声明为公共的。
这里唯一保留完整功能的真正解决方案是使用反射来访问方法并绕过访问修饰符。
所以这是我的解决方案,
public class B<E extends Cloneable> {
E data;
public B(E elem) {
this.data = elem;
}
@SuppressWarnings("unchecked")
public E get() {
Method clone = null;
try {
clone = data.getClass().getMethod("clone");
Object[] args = new Object[0];
return (E) clone.invoke(data, args);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
Clonable确定 Object 的受保护克隆实现的行为:如果类实现了Cloneable,则 Object 的 clone 方法返回对象的逐字段副本;否则它会抛出CloneNotSupportedException. 但是您在类A中实现克隆方法的方式不会调用Object's clone方法,因此这没有效果。
@Override
public A clone() throws CloneNotSupportedException {
A temp = new A(this.value, this.name);
return temp;
}
如果您想使用该功能,则必须像这样实现它,
public class A implements Cloneable {
int value;
String name;
public A(int x, String str) {
this.value = x;
this.name = str;
}
@Override
public A clone() throws CloneNotSupportedException {
return (A) super.clone();
}
public boolean equals(A elem) {
return (this.name).equals(elem.name) && this.value == elem.value;
}
}
在这种情况下,如果您的类A没有实现,Cloneable那么java.lang.CloneNotSupportedException将被抛出。
最后,public class B<E extends Cloneable>如果您尝试将未实现的内容Cloneable传递B给Demo类中的构造函数,则该声明会给您一个编译器错误。
B<A> c = new B<>(doesNotImplCloneable); // Gives a compilation error.
因此,如果您正在使用我在这里展示的对象的克隆方法,那么这extends/implements Cloneable就是要走的路。
添加回答
举报
