繁体   English   中英

Java-通用静态方法

[英]Java - Generic Static Methods

我一直在试图了解是否有可能创建一种基于返回类来推断泛型并调用该泛型的静态方法的方法。

即在下面,我创建2个类,这两个类均实现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;
    }

}

亚类

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

包装器-显示问题

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

 }

运行包装程序时,出现以下错误:

线程“主”中的异常java.lang.ClassCastException:不能在Wrapper.main(Wrapper.java:20)处将ParentClass强制转换为SubclassA

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

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

不,你不能这样做。 要使其工作,您可以传递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;
    }
}

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

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

更新:此外,在您的方案中,工厂模式似乎比调整用于获取/构造特定类对象的泛型更合适。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM