java如何调用T的超类方法(泛型)

时间:2011-03-02 21:11:35

标签: java

我有以下方法。我想找到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的超类

3 个答案:

答案 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()提供默认实现 - 就像您尝试在发布的代码中实现的那样。