[英]Using Clone() with polymorphism from interface in java
我在嘗試弄清楚如何從其引用為接口類型的對象中調用克隆方法時遇到問題。
基本上,這就是我需要做的。
for(Interface obj: objs)
array.add(obj.clone());
我不知道什么是obj類型,我只知道它實現了Interface,當我嘗試這段代碼時,我得到了
“接口類型的方法clone()未定義”。
當我嘗試將clone()放在接口上時,我得到:
“類型為Interface的方法clone()必須重寫或實現超類型方法”,因為我正在使用@Override標記。
我的意圖是最后使用Object.clone()。 但我只是想不通。
有什么想法嗎?
真實代碼:
public interface Caracteristica {
@Override <---problem
public Object clone() throws CloneNotSupportedException;
@Override <---fine
public boolean equals(Object obj);
}
private final void setCaracteristicas(ArrayList<Caracteristica> caracteristicas) {
this.caracteristicas = new ArrayList<>();
for(Caracteristica caracteristica: caracteristicas)
this.caracteristicas.add((Caracteristica)caracteristica.clone());
}
基本上, clone()
和Cloneable
接口以多種方式破壞,甚至根據Josh Bloch的說法,也應避免這種情況。 (請參閱: http : //www.artima.com/intv/bloch13.html )
向您的接口添加一個新方法,該方法返回接口類型,並在您的類中實現該方法以進行復制。
編輯添加:忽略上面的語句,之所以告訴您界面中的@Override
批注不正確是因為...是。 您沒有擴展定義clone()
的接口。
接口不擴展Object
; JLS的9.2節告訴我們:
如果接口沒有直接的超接口,則該接口隱式聲明帶有簽名s的公共抽象成員方法m,返回類型r,並引發與每個帶有簽名s的公共實例方法m,返回類型r和throws子句t對應的子句t在Object中聲明,除非接口顯式聲明了具有相同簽名,相同返回類型和兼容throws子句的方法。
clone()
在Object
protected
,因此不被隱式包含。 如果您的IDE說要添加@Override
標記,請將該錯誤報告為錯誤,因為它是錯誤的。
另一方面, equals()
在Object
是public
的,因此除非您重寫它,否則它將包含在隱式超級接口中。
如果你一定和決心,這將工作,但它真的很丑陋由於造成的混亂clone()
無論是在被定義Object
和MyInterface
,並讓它返回接口類型(這是允許的,因為它是一個協變型):
public interface MyInterface {
MyInterface clone();
void doSomething();
}
public class MyClass implements MyInterface {
@Override
public void doSomething() {
System.out.println("Hi");
}
@Override
public MyInterface clone() {
return new MyClass();
}
public static void main(String[] args) {
MyInterface mi = new MyClass();
MyInterface mi2 = mi.clone();
mi2.doSomething();
}
}
Object.clone()
protected
,您不能從類或其子類外部調用它,除非它們將訪問修飾符顯式更改為public
因此不能保證對象具有可見的clone()
方法。
您必須在接口中定義它,或者在基類中覆蓋它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.