[英]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.