我使用Eclipse IDe和Apache Commons DBUtils库,我有一些从BasicRowProcessor class扩展的行处理器类。在这个类中,我重写了这两个DButils的方法:
public <T> T toBean(ResultSet rs, Class<T> type) throws SQLException
和
public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException
我对toBeanList
方法的实现如下:
@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);
}
}
我遍历ResultSet
并调用toBean
方法获取所有记录。它有效,但Eclipse报告了一些问题(可能与Java泛型有关),请看这个截图:
当我将clazz
参数设置为Class<TaskItem> clazz
时,Eclipse会报告另一个问题,并且它不会覆盖上层BasicRowProcessor
中的方法。
我该如何解决这个问题?我究竟做错了什么?或者忽略此警告是否安全?可能很容易解决这个问题,但我还没有找到解决方案。
修改:
我试图对我的两个方法进行参数化,但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报道:
答案 0 :(得分: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
答案 1 :(得分:0)
尝试以这种方式声明您的方法:
public LinkedList<Object> toBeanList(ResultSet rs, Class<Object> clazz)
答案 2 :(得分:0)
该声明中的T
是一个类型变量,它必须在您使用它的任何地方保持一致。在这种情况下,方法(以及类中的其他位置,例如on T
)上的所有toBean
必须匹配。拥有类变量的目的是告诉Java你从ResultSet
中提取了什么类型的对象,所以你需要像这样声明你的方法:
public LinkedList<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> class)
请注意,在这种情况下,如果您已经知道您正在使用TaskItem
,则无需将其传递给toBeanList
,除非您覆盖的方法需要它。
答案 3 :(得分:0)
如方法定义中所述:
public <T> List<T> toBeanList(ResultSet rs, Class<T> type) throws SQLException
Class的'T'应该与List的T相同。
所以你的方法定义应该是:
public List<TaskItem> toBeanList(ResultSet rs, Class<TaskItem> type) throws SQLException{
//Code
}
这是你的方法看起来的样子吗?
答案 4 :(得分: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);
}