2013-11-27 63 views
0

我使用Eclipse IDe和Apache Commons DBUtils庫,並且我有一些從BasicRowProcessor class擴展的自己的行處理器類。在這個班,我重寫這兩個DButils'方法:參數化Java中的原始類型

public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException 

public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException 

toBeanList方法的實現如下:通過ResultSet和呼叫

@Override 
    public LinkedList<Object> toBeanList(ResultSet rs, Class clazz) { 
     try { 
      LinkedList<Object> newlist = new LinkedList<Object>(); 
      while (rs.next()) { 
       newlist.add(toBean(rs, clazz)); 
      } 
      return newlist; 
     } catch (SQLException ex) { 
      throw new RuntimeException(ex); 
     } 
    } 

我環路其所有記錄均採用toBean方法。它的工作原理,但是Eclipse報告了一些問題(可能與Java的泛型),請看到這個截圖:

enter image description here

當我設置參數化clazz參數作爲Class<TaskItem> clazz Eclipse的報告中其他的問題,而不會覆蓋方法上層階級BasicRowProcessor

enter image description here

我怎樣才能解決這個問題呢?我究竟做錯了什麼?或者是否可以忽略此警告?可能解決這個問題很容易,但我還沒有找到解決方案。

編輯:

我試圖參數化我的兩個方法,但Eclipse的報告,我需要重寫超類型。

toBeanList方法:

@Override 
    public LinkedList<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> clazz) { 
     try { 
      LinkedList<TaskItem> newlist = new LinkedList<TaskItem>(); 
      while (rs.next()) { 
       newlist.add(toBean(rs, clazz)); 
      } 
      return newlist; 
     } catch (SQLException ex) { 
      throw new RuntimeException(ex); 
     } 
    } 

而且toBean方法:

@Override 
    public TaskItem toBean(ResultSet rs, Class<TaskItem> clazz) throws SQLException { 

     TaskItem item = new TaskItem(); 
    // some stuff....  
     return item; 

    } 

這Eclipse的報告:

enter image description here

回答

2

您使用

public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException 

該類型的佔位符是T。這意味着結果列表是T的列表,並且作爲參數傳遞的類是Class<T>。因此,當您需要LinkedList<Object>時,您需要將Class<Object>傳遞給該方法。

當你想通過一個Class<TaskItem>你會得到一個LinkedList<TaskItem>。因此,這將是

public List<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> type) throws SQLException 
+0

是的,我試了一下,但是當我宣佈返回類型列出類Eclipse的報告,我需要重寫一個超類型方法。這是我想要解決的問題。謝謝! – user2148736

+0

您可以發佈您在參數化方法調用時使用的代碼嗎?即來自上方的圖像沒有警告。 – mvieghofer

+0

謝謝,我在我的原始問題中添加了一個我的方法示例。 – user2148736

0

嘗試宣告你的方法是這樣的:

public LinkedList<Object> toBeanList(ResultSet rs, Class<Object> clazz) 
0

在聲明中T是一種變量,它必須跨越無論你正在使用它是一致的。在這種情況下,方法中的所有T(以及該課程中的其他地方,例如toBean)必須匹配。具有類變量的意義在於告訴Java的你從ResultSet提取什麼類型的對象,所以你需要聲明你的方法是這樣的:

public LinkedList<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> class) 

注意,在這種情況下,如果你已經知道你正在使用TaskItem專門,將它傳遞給toBeanList將是必要的,除非你重寫的方法需要它。

0

如在方法定義中提到:

public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException 

類的「T」應當是相同列表的T-。

所以你的方法定義應該是:

public List<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> type) throws SQLException{ 
//Code 
} 

這是你的方法看起來如何?

0

試試這個。

toBeanList方法

@Override 
public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException { 
    List<T> list = new ArrayList<T>(); 
    while (rs.next()) { 
     list.add(toBean(rs, type)); 
    } 
    return list; 
} 

toBean方法

@Override 
public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException { 
    TaskItem item = new TaskItem(); 

    //populate item ... 

    return type.cast(item); 
}