Java中参数化原始类型的泛型
我使用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;
}
本期月食报道:
# 1 楼答案
该声明中的
T
是一个类型变量,在使用它的任何地方都必须保持一致。在这种情况下,方法上的所有T
必须匹配(以及类中的其他地方,例如toBean
)。使用class变量的目的是告诉Java您正在从ResultSet
中提取什么类型的对象,因此您需要像下面这样声明您的方法:请注意,在这种情况下,如果您已经知道正在专门使用
TaskItem
,则无需将其传递给toBeanList
,除非覆盖的方法需要它# 2 楼答案
你用
类型的占位符是
T
。这意味着结果列表是T
的列表,作为参数传递的类是Class<T>
。因此,当您想要一个LinkedList<Object>
时,需要将Class<Object>
传递给该方法当你想通过一个
Class<TaskItem>
时,你会得到一个LinkedList<TaskItem>
。因此它将是# 3 楼答案
尝试以下方式声明您的方法:
# 4 楼答案
试试这个
toBeanList方法
toBean方法