我一直在试图了解是否有可能根据返回类推出泛型类型并调用该泛型类型的静态方法。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中执行此操作吗?
不明白你在这里期待什么....你在一个类上调用静态方法,它会被执行。为什么它应该把调用委托给一个子类呢?以及如何确定哪一个? – Gab
那么希望通过从返回类型推断来确定要委派哪个子类。 现在我明白,你不能覆盖它有意义的静态方法。 – user2294382