我有以下类,它接受一个接口并执行一些函数:
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方法?
最诚挚的问候, 桑德罗
答案 0 :(得分:1)
将类型参数<T>
或<T extends ObjectDataBaseClass>
添加到IMSSQLStatement
和MSSQLStatement
,将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,也可以使用所需的功能。或者您可以将它用作构建自己的持久层实现的有用指南。