在java中使用Clone()和接口多态性
我在试图弄清楚如何从引用为接口类型的对象调用clone方法时遇到了问题
基本上这就是我需要做的
for(Interface obj: objs)
array.add(obj.clone());
我不知道obj类型是什么,我只知道它实现了接口,当我尝试这段代码时,我得到了
“类型接口的方法clone()未定义”
当我尝试将clone()放到我的界面上时,我得到:
“接口类型的方法clone()必须重写或实现超类型方法”,因为我使用的是@override标记
我的意图是使用对象。最终克隆()。但我就是搞不懂
有什么想法吗
真正的代码是:
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());
}
# 1 楼答案
基本上,
clone()
和Cloneable
接口在许多方面都被破坏,甚至根据Josh Bloch的说法,应该避免这种情况。(见:http://www.artima.com/intv/bloch13.html)向接口添加一个新方法,该方法返回接口类型,并在类中实现该方法以制作副本
编辑以添加:忽略上述语句,它告诉您界面中的
@Override
注释不正确的原因是。。。它是。您没有扩展定义clone()
的接口接口不扩展
Object
Section 9.2 of the JLS告诉我们:clone()
是protected
在Object
中,所以它不是隐式包含的。如果您的IDE要求添加@Override
标记,请将其报告为错误,因为它是错误的另一方面,
equals()
在Object
中是public
,因此除非重写它,否则它将包含在隐式超级接口中如果你已经下定决心,这将起作用,尽管这真的很难看,因为
clone()
在Object
和MyInterface
中都定义了clone()
,并让它返回接口类型(这是允许的,因为它是协变类型):