我正在尝试编写一个通用方法,该方法将获取SQL字符串和键值,并返回一个ArrayList,其中T是结果集中行的相应类型。我一直在遇到类型擦除问题。我最近的尝试看起来像:
public static <T extends CMObject> void populateCMObjectsByKey(int key, String SQL, ArrayList<T> list) throws SQLException, ObjectNotFoundException {
Connection connection = null;
PreparedStatement pstatement = null;
ResultSet rs = null;
try {
connection = TomcatConnectionManager.getInstance().getConnection(ClientManagerConstants.dbName);
pstatement = connection.prepareStatement(SQL);
pstatement.setInt(1, key);
rs = pstatement.executeQuery();
while (rs.next()) {
T.createFromResultSet(rs, list);
}
} finally {
if (rs != null) {
rs.close();
}
if (pstatement != null) {
pstatement.close();
}
//
connection.close();
TomcatConnectionManager.getInstance().freeConnection(ClientManagerConstants.dbName, connection);
}
return;
}
编译器在“T.createFromResultSet(rs,list);”上显示错误,其中显示“CMObject类型中的方法createFromResultSet(ResultSet,ArrayList)不适用于参数(ResultSet,ArrayList)”。我想做的不可能吗?
答案 0 :(得分:1)
问题在于,static
方法不能从泛型类型引用中获得 - 只有来自任何上限的非静态方法(此处为CMObject
)。此外,无法覆盖static
方法。
由于这两个原因,在createFromResultSet
及其子类中使CMObject
非静态是实现此功能的唯一方法。但是,你需要一个实例来处理。
// Add an instance as another parameter.
public static <T extends CMObject> void populateCMObjectsByKey(
int key, String SQL, ArrayList<T> list, T populator)
throws SQLException, ObjectNotFoundException {
然后你就可以在实例上调用该方法:
populator.createFromResultSet(rs, list);