动态指定返回的数组列表的对象类型

时间:2013-03-07 11:35:39

标签: java types casting arraylist

我有以下类,它接受一个接口并执行一些函数:

public class MSSQLHandler {

    IMSSQLStatement statement;

    public MSSQLHandler(IMSSQLStatement statement) {
        this.statement = statement;
    }

    public void invoke() throws SQLException {
        statement.executeStatement();
    }

    public List<?> getDataList() throws SQLException {
        return statement.getDataList();
    }
}

接口由抽象类实现:

public abstract class MSSQLStatement implements IMSSQLStatement {

    protected Connection conn = null;
    protected ResultSet rs = null;

    protected abstract String createStatement() throws SQLSyntaxErrorException;

    public MSSQLStatement(Connection conn) {    
       this.conn = conn;
    }

    public void executeStatement() throws SQLException {    
       Statement st = conn.createStatement();
       String sql = createStatement();
       if(sql != null) {
          rs = st.executeQuery(createStatement());
       } else {
          throw new SQLException("Method 'createStatement()' has to be implemented.");
       }
    }    
}

传递给处理程序类的类(或接口)从上面扩展抽象类:

public class MSSQLTaskStatement extends MSSQLStatement {

    public MSSQLTaskStatement(Connection conn) {
    super(conn);
    }

    private String projectName = null;

    public void setProjectName(String projectName) {
    this.projectName = projectName;
    }

    protected String createStatement() throws SQLSyntaxErrorException {
      // Create SQL query
    }

    @Override
    public List<MyObjectData> getDataList() throws SQLException {
      // Wrap results into a data object and save it to an array list
      List<MyObjectData> l = new ArrayList<MyObjectData>()
      while(rs.next()) {
         MyObjectData o = new MyObjectData();
         o.setColumn1(rs.getString(1))
         l.add(o);
      }
      return l;
    }
}

问题是,是否可以将已重写的MyObjectData方法的返回列表的对象类型(getDataList())从类MSSQLTaskStatement传递到处理程序类{{1方法?

最诚挚的问候, 桑德罗

2 个答案:

答案 0 :(得分:1)

将类型参数<T><T extends ObjectDataBaseClass>添加到IMSSQLStatementMSSQLStatement,将IMSSQLStatement中的方法getDataList更改为List<T> getDataList()并使用public class MSSQLTaskStatement extends MSSQLStatement<MyObjectData>

然后,如果您的MSSQLHandler有一个字段IMSSQLStatement<MyObjectData> statement,则其自己的getDataList()可以安全地返回List<MyObjectData>(或者您可以MSSQLHandler通用同样,如果你想将它与不在MyObjectData上构建的语句一起使用。

答案 1 :(得分:0)

请参考Spring的JdbcTemplate课程。即使不使用Spring,也可以使用所需的功能。或者您可以将它用作构建自己的持久层实现的有用指南。