尝试创建将使用SQL语句和键</t>返回ArrayList <t>的方法

时间:2013-12-10 17:29:20

标签: java sql generics

我正在尝试编写一个通用方法,该方法将获取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)”。我想做的不可能吗?

1 个答案:

答案 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);