我一直在試圖瞭解是否有可能根據返回類推出泛型類型並調用該泛型類型的靜態方法。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