有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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) 个答案

  1. # 1 楼答案

    基本上,clone()Cloneable接口在许多方面都被破坏,甚至根据Josh Bloch的说法,应该避免这种情况。(见:http://www.artima.com/intv/bloch13.html

    向接口添加一个新方法,该方法返回接口类型,并在类中实现该方法以制作副本

    编辑以添加:忽略上述语句,它告诉您界面中的@Override注释不正确的原因是。。。它是。您没有扩展定义clone()的接口

    接口不扩展ObjectSection 9.2 of the JLS告诉我们:

    If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.

    clone()protectedObject中,所以它不是隐式包含的。如果您的IDE要求添加@Override标记,请将其报告为错误,因为它是错误的

    另一方面,equals()Object中是public,因此除非重写它,否则它将包含在隐式超级接口中

    如果你已经下定决心,这将起作用,尽管这真的很难看,因为clone()ObjectMyInterface中都定义了clone(),并让它返回接口类型(这是允许的,因为它是协变类型):

    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();
        }
    
    }