Java 使用Class.cast()方法进行嵌套转换

Java 使用Class.cast()方法进行嵌套转换,java,class,casting,clone,Java,Class,Casting,Clone,我有一个Person类,它实现了Cloneable。然后我有对象p和o,它们引用了人对象。我试图将一个克隆到另一个,并发现以下方法有效: Object p = new Person("Heather"); Object o = ((Person)p).clone(); (我必须使用该强制转换,因为clone()在对象中受保护。我使用它来调用Person中的clone()。) 我需要知道的是如何使用Class.cast()执行上述转换。我知道怎么投一次,大概是这样的: Object o = p.

我有一个
Person
类,它实现了
Cloneable
。然后我有对象
p
o
,它们引用了
对象。我试图将一个克隆到另一个,并发现以下方法有效:

Object p = new Person("Heather");
Object o = ((Person)p).clone();
(我必须使用该强制转换,因为
clone()
在对象中受保护。我使用它来调用
Person
中的
clone()
。)

我需要知道的是如何使用
Class.cast()
执行上述转换。我知道怎么投一次,大概是这样的:

Object o = p.getClass().cast(p);
public interface Copier<T> {
    public T createCopy(T obj);
}

public class PersonCopier
implements Copier<Person> {
    @Override
    public Person createCopy(Person person) {
        return new Person(person.getName());
    }
}

public static <T> T doStuffInvolvingCopy(T inObject, Copier<T> copier) {
    ...

    T copy = copier.createCopy(inObject);

    ...

    return copy;
}
但是如何以这种方式执行嵌套转换示例。(我需要知道,因为在这个项目中,我并不总是知道要转换到哪个类,但我会知道该类是可克隆的)

我试过… ((可克隆的)p.clone() …但这不起作用。clone()方法是对象类中受保护的方法,接口Cloneable没有clone()方法,因此编译器无法识别它

我找遍了所有地方都找不到答案。感谢您的帮助。

使用
clone()
在代码中是不寻常的(我从来没有使用过它,也没有见过它像这样被明确使用过)

通常用于制作副本的模式是,例如:


源对象的重要字段的值用于初始化新对象的字段值。

由于克隆的工作方式,这有点困难。正如您所注意到的,clone几乎是一个受保护的方法,所以您需要在编译时使用一个类来调用它。有一种方法可以解决这个问题,那就是声明一个接口,为其分配公共访问权:

public interface PublicCloneable
extends Cloneable {
    public Object clone();
}
然后实现它,而不是可克隆的。然后您可以强制转换到PublicCloneable以调用克隆。这将正常工作,但它仍然带有克隆的所有正常问题

创建副本构造函数是克隆的一个很好的替代方法,如果您在编译时不知道类,您可以创建一个方法来使用反射调用它:

static Object reflectionCopy(Object obj) {
    try {
        Class<?> cls = obj.getClass();
        Constructor<?> ctor = cls.getConstructor(cls);
        return ctor.newInstance(obj);
    } catch(Exception e) {
        return obj;
    }
}
你可以这样说

doStuffInvolvingCopy(new Person("Heather"), new PersonCopier());
或者把工厂登记在某个地方,这样它们就不需要被传阅了


工厂之所以好,是因为它们不使用克隆,也不使用反射。

如果你知道它们都是可克隆类型,而你只是想克隆它们,我不明白你为什么不能用对象o=((可克隆)p).clone();。FTW!cast所做的就是对对象执行强制转换检查操作,以确保它是该类的实例。然后它将它留给编译器(可能会执行另一次强制转换检查)来执行它的通用踢踏舞。clone()是对象上受保护的方法,它不在接口中可克隆,因此编译器无法识别它。还有其他想法吗?也许可以用您自己的界面包装
Cloneable
,该界面支持
clone()
方法?您所说的“嵌套转换”是什么意思???
doStuffInvolvingCopy(new Person("Heather"), new PersonCopier());