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就是要走的路。
添加回答
舉報