2012-09-27 54 views
4

我試圖創建的環境的虛擬模板方法如下:使用Java創建

我有一個包含接收由查詢數據庫填補了ResultSet靜態模板方法的基類,並返回一個正確結果的列表。

我有一些類,從上面引用的一個派生,表示從數據庫中的每個表,並且他們都有一個構造函數接收ResultSet並構建該對象。

我寫的代碼是:

public class TableBase 
{ 
    public static <T extends TableBase> List<T> getResults(ResultSet p_Rs) throws SQLException, InstantiationException, IllegalAccessException 
    { 
     List<T> v_Table = new ArrayList<T>(); 
     T v_TB = null; 
     while(p_Rs.next()) 
      v_Table.add(new T(p_Rs)); 
     return v_Table; 
    } 
} 

我得到的錯誤是:Cannot instantiate the type T

我很清楚,編譯器需要「知道」所有子類將實現接收變量的構造函數,但我不能創建「抽象構造函數」。

有沒有人有如何解決這個問題的線索?

謝謝大家提前。

+0

你必須通過一些功能的對象,知道'T'。也許某種工廠對象 –

回答

1

你不能那樣做。你必須告訴運行時確切的類型。

也許你可以這樣做:

  1. TableBase必須有一個默認的構造函數。
  2. TableBase必須有一個setResultSet方法。

    public class TableBase { 
        public static <T extends TableBase> List<T> getResults(ResultSet p_Rs, Class<T> clazz) 
         throws SQLException, InstantiationException, IllegalAccessException { 
        List<T> v_Table = new ArrayList<T>(); 
        T v_TB = clazz.newInstance(); 
        while (p_Rs.next()) 
         v_TB.setResultSet(p_Rs); 
        v_Table.add(v_TB); 
        return v_Table; 
        } 
    } 
    
2

無法實例泛型類型。

您可以使用廠

public static <T extends TableBase> List<T> getResults 
(ResultSet p_Rs, Factory<T> factory) 

//Create instance using factory 

或Class類型。

public static <T extends TableBase> List<T> getResults 
(ResultSet p_Rs, Class<T> type) 
//type.newInstance() 
0

您可以使用反映,這樣的:

while(p_Rs.next()) 
     v_Table.add(newInstance(T, p_Rs)); 


public <T extends TableBase> T newInstance(T t, ResultSet p_Rs){ 
     try { 
      Constructor constructor = t.getClass().getDeclaredConstructor(ResultSet.class); 
      return (T)constructor.newInstance(p_Rs); 

     } catch (Exception e) { 
      throw new RuntimeException(); 
     } 

}