2013-04-18 74 views
8

我一直在试图了解是否有可能根据返回类推出泛型类型并调用该泛型类型的静态方法。Java - 通用静态方法

即下面我创建了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; 
    } 

} 

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

包装 - 显示问题

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

} 

当运行包装我收到以下错误:

防爆在主线程“main”中的ception java.lang.ClassCastException:ParentClass不能转换为子类A at Wrapper.main(Wrapper.java:20)

我可以在Java中执行此操作吗?

+0

不明白你在这里期待什么....你在一个类上调用静态方法,它会被执行。为什么它应该把调用委托给一个子类呢?以及如何确定哪一个? – Gab

+0

那么希望通过从返回类型推断来确定要委派哪个子类。 现在我明白,你不能覆盖它有意义的静态方法。 – user2294382

回答

1

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

更新: 进一步添加,在您的方案工厂模式似乎比调整泛型获取/构造特定的类对象更合适。

2

静态方法不会override.This static方法都属于Class水平

1

不,你不能像这样做。为了使它工作,你可以把类对象:

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

而且,在你的榜样,你在父类和子类相当于静态方法。子类方法不覆盖父类方法,它们只是隐藏它们,而这几乎肯定不是你想要的。上面的这个工具类方法解决了这个问题。