Java - 通用静态方法

use*_*382 8 java generics static-methods

我一直试图了解是否有可能创建一个方法,根据返回类推断泛型类型,并调用该泛型类型的静态方法.

即在下面我创建了两个类,它们都实现了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;
    }

}
Run Code Online (Sandbox Code Playgroud)

SubclassA

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;
      }
 }
Run Code Online (Sandbox Code Playgroud)

包装 - 显示问题

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

 }
Run Code Online (Sandbox Code Playgroud)

运行Wrapper时出现以下错误:

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

我可以用Java做到这一点吗?

har*_*rsh 1

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

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