8

我一直在尝试了解是否可以创建一个基于返回类推断泛型类型并调用该泛型类型的静态方法的方法。

即下面我创建了两个类,它们都实现了getInstances 和getAllInstances 方法。然后我尝试创建使用来自通用包装器的方法。似乎无论返回类型如何,超类方法总是在运行。

例如,

public class ParentClass {

    public ParentClass(){}

    public static <T extends ParentClass> T getInstance(){
        return (T) new ParentClass();
    }

    public static <T extends ParentClass> List<T> getAllInstances(){
        ArrayList<ParentClass> parents = new ArrayList<ParentClass>();

        for(int i=0;i<5;i++){
            parents.add(new ParentClass());
        }

        return (List<T>) parents;
    }

}

子类A

public class SubclassA extends ParentClass{

     public SubclassA(){}

    @SuppressWarnings("unchecked")
    public static SubclassA getInstance(){
         return new SubclassA();
    }

    @SuppressWarnings("unchecked")
    public static List<SubclassA> getAllInstances(){
        ArrayList<SubclassA> parents = new ArrayList<SubclassA>();

          for(int i=0;i<5;i++){
             parents.add(new SubclassA());
          }

         return parents;
      }
 }

Wrapper - 显示问题

 public class Wrapper {

    public Wrapper(){
        // ... some other stuff
    }

    public <T extends ParentClass> T getInstance(){
        return T.getInstance();
    }

    public <T extends ParentClass> List<T> getAllInstances(){
        return T.getAllInstances();
    }

    public static void main(String... args){
        Wrapper wrapper = new Wrapper();

        SubclassA subclassA = wrapper.getInstance();
        ParentClass parentClass = wrapper.getInstance();

        System.out.println(subclassA.getClass().getName());
        System.out.println(parentClass.getClass().getName());
    }

 }

运行 Wrapper 时出现以下错误:

线程“main”java.lang.ClassCastException 中的异常:ParentClass 无法在 Wrapper.main 中转换为 SubclassA(Wrapper.java:20)

我可以在 Java 中做到这一点吗?

4

3 回答 3

2

静态方法不会被覆盖static。此方法将属于Class级别

于 2013-04-18T09:56:25.440 回答
1

不,你不能这样。要使其工作,您可以传递 Class 对象:

public class ParentClassUtils

    public static <T extends ParentClass> T getInstance(Class<T> clazz) {
        return clazz.newInstance();
    }

    public static <T extends ParentClass> List<T> getAllInstances(Class<T> clazz) {
        List<T> list = new ArrayList<T>();
        for (int i = 0; i < 5; i++) {
            list.add(getInstance(clazz));
        }
        return list;
    }
}

此外,在您的示例中,您在父类和子类中有等效的静态方法。子类方法不会覆盖父类方法,它们只是隐藏它们,这几乎肯定不是你想要的。上面的这个实用程序类方法解决了这个问题。

于 2013-04-18T10:00:03.700 回答
1

您的方法不正确,Java 中没有静态概念,Inheritance因为继承总是在对象级别的上下文中。只有成员方法(非静态)可以被具有适当访问修饰符的子类继承。

更新:进一步补充,在您的场景中,工厂模式似乎比调整泛型以获取/构造特定类对象更合适。

于 2013-04-18T10:04:24.040 回答