如何在泛型类[Java]中正确实现对clone()的调用

如何在泛型类[Java]中正确实现对clone()的调用,java,generics,clone,Java,Generics,Clone,我有一个通用接口,我必须创建一个类来实现它。我起初认为这会很好,在文档中提到接口需要一个实现clone方法的类 genericClass<E extends Cloneable> implements genericInterface<E extends Cloneable>{ E data; //code public E get(){ return this.data.clone() } } 因为这个项目应该是一个数据存储,我真的怀疑我的老师想要一些通用E元素的

我有一个通用接口,我必须创建一个类来实现它。我起初认为这会很好,在文档中提到接口需要一个实现clone方法的类

genericClass<E extends Cloneable> implements genericInterface<E extends Cloneable>{
E data;

//code

public E get(){
return this.data.clone()
}
}

因为这个项目应该是一个数据存储,我真的怀疑我的老师想要一些通用E元素的浅拷贝(注意,这只是一个简单的克隆测试程序,而不是实际的项目)。有谁能告诉我为什么这不起作用,或者我怎样才能使它起作用?我不能对输入E元素做任何假设,只是它有自己的clone()方法

,因为
clone
方法在
对象
类上被标记为
protected
,通常不能在任意对象上调用此方法。
clone()
方法背后的思想是,支持该方法的类将重写该方法,并将其声明为public

这里唯一保留完整功能的真正解决方案是使用反射来访问方法并绕过访问修饰符

这是我的解决方案

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

    }
}
如果你想利用这个设施,你必须像这样实施它

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

最后,如果您试图将未实现
Cloneable
的内容传递给
Demo
类中的
B
构造函数,则声明
public class B
会给您一个编译器错误

B<A> c = new B<>(doesNotImplCloneable);   // Gives a compilation error.
bc=新的B(不可修改);//给出一个编译错误。

因此,如果您正在使用对象的克隆方法,如我在这里所示,
extensed/implements Cloneable
是一个不错的选择。

谢谢,您的回答让我了解了这一点。如果以这种方式直接获取clone()方法,“extends/implements Cloneable”是否有任何用途?我可以只使用invoke(数据)而不是invoke(数据、参数)吗?
@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;
    }
}
B<A> c = new B<>(doesNotImplCloneable);   // Gives a compilation error.