2013-04-18 72 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; 
    } 
} 

而且,在你的榜樣,你在父類和子類相當於靜態方法。子類方法不覆蓋父類方法,它們只是隱藏它們,而這幾乎肯定不是你想要的。上面的這個工具類方法解決了這個問題。