我有以下方法。我想找到T是否有超类,如果是,那么调用超类的cloneEntity方法
public Clone(Class<T> typeParameterClass) {
this.typeParameterClass = typeParameterClass;
}
public T cloneEntity(){
T clonedEntity = typeParameterClass.newInstance();
Class superClass = typeParameterClass.getSuperclass();
if(superClass != null){
//call clone method of the superclass to copy superclass properties
?????????
}
}
更多解释
我不想尝试实例化超类。我正在尝试创建一个说地址的实例。 Address扩展BaseEntity并具有deepCopy()方法。 BaseEntity本身有一个deepCopy()方法。在创建Address实例后,我想在Address上调用deepCopy()方法,然后在超类BaseEntity上调用
更多解释
我想摆脱像Address,User等每个对象中的deepCopy()方法,并创建一个通用的方法。因此T可以是Address或User,但我想在泛型实现中调用T的超类
答案 0 :(得分:2)
每个没有显式extends
的类都有java.lang.Object
作为超类(接口和基元不是类),所以检查不是你想象的那样。
如果要检查类是否实现了cloneable,可以执行以下操作:
Cloneable.class.isAssignableFrom( YourType.class );
答案 1 :(得分:0)
鉴于你已经创建了一个类的实例,一个糟糕的旧instanceof
和一个演员应该可以做到这一点。然而,反思几乎不是正确的答案。
答案 2 :(得分:0)
首先,在超类上调用clone()
需要一些反射黑客,因为clone()
在Object中受到保护。
但是在Object中定义的旧式clone()有什么问题(在Cloneable中有记录)?这涉及总是调用super.clone(),因此对你的情况应该没问题。
您只需要一个将clone()
声明为公开的界面,然后您的T应该看起来像<T extends ThatInterface>
。您还可以拥有一个实现ThatInterface
的抽象类,并为clone()
提供默认实现 - 就像您尝试在发布的代码中实现的那样。