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