2013-11-27 65 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); 
}