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

标签 java types casting arraylist

我有以下类,它采用接口(interface)并执行一些函数:

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();
    }
}

接口(interface)由抽象类实现:

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.");
       }
    }    
}

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

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 中的方法到处理程序类public List<?> getDataList() throws SQLException方法?

最诚挚的问候, 桑德罗

最佳答案

<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 设为通用)。

关于java - 动态指定返回数组列表的对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15270133/

相关文章:

java - 如何定义方法返回 this 的结构类型

c++ - const_cast 与 static_cast

当不确定类型是什么时,C++ cast void*

java - 合并和延迟加载

java - 当对象不再存在时通知适配器的数据源

java - 记录实际的存储库类而不是 JPARepository 的 CrudRepository

c - 小于 (<) 运算符如何与 c 中的混合类型一起使用

C类型无法被正确识别

typescript - 在 Typescript 中解构函数参数

c# - C# 中的 MySQL 转换