gpt4 book ai didi

java - 如何实现通用接口(interface)的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:14 27 4
gpt4 key购买 nike

我有这个界面:

public interface ParsableDTO<T> {
public <T> T parse(ResultSet rs) throws SQLException;
}

在某种 dto 类中实现,在另一个类中实现此方法:

public <T extends ParsableDTO<T>> List<T> getParsableDTOs(String table, 
Class<T> dto_class) {
List<T> rtn_lst = new ArrayList<T>();
ResultSet rs = doQueryWithReturn(StringQueryComposer
.createLikeSelectQuery(table, null, null, null, true));

try {
while(rs.next()) {
rtn_lst.add(T.parse(rs)); //WRONG, CAN'T ACCESS TO parse(...) OF ParsableDTO<T>
}
rs.close();
} catch (SQLException e) {
System.err.println("Can't parse DTO from "
+ table + " at " + dateformat.format(new Date()));
System.err.println("\nError on " + e.getClass().getName()
+ ": " + e.getMessage());
e.printStackTrace();
}

return rtn_lst;
}

如何访问接口(interface)的方法parse(ResultSet rs) 来解析特定的T?是否有可行的、不同的和/或更好的方法来做到这一点?

最佳答案

您正试图在泛型上调用非静态方法,该泛型在编译时被删除。即使该方法是静态的,编译器也不会允许这样做(因为在这种情况下 T 是 ParseableDTO,而不是具体实现)。

相反,假设您使用的是 Java 8,我会这样做:

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(ResultSet rs) throws SQLException;
}

然后:

public <T> List<T> getParsableDTOs(String table, RowMapper<T> mapper) {
try (ResultSet rs = doQueryWithReturn(StringQueryComposer
.createLikeSelectQuery(table, null, null, null, true))) {
List<T> rtn_lst = new ArrayList<T>();
while(rs.next()) {
rtn_lst.add(mapper.mapRow(rs));
}
return rtn_lst;
} catch (SQLException e) {
// ...
}

return rtn_lst;
}

接口(interface)RowMapper 派生自现有框架,例如JDBC Template .

这个想法是为了分离关注点:DTO 不会被 JDBC 相关方法污染(例如:映射或解析,但我建议您避免使用 parse 名称,因为您并不是真正在解析 SQL ResultSet 此处),您甚至可以将映射保留在 DAO 中(lambda 使其更易于实现)。

用 JDBC 污染 DTO 可能会有问题,因为客户端/调用者可能没有有效的 ResultSet 传递给 parse。更糟糕的是:在较新的 JDK (9++) 中,ResultSet 接口(interface)位于 java.sql 模块中,该模块可能不可用(如果考虑 Web 服务,客户端根本不需要 JDBC)。

附带说明,从 Java 7 开始,您可以将 try-with-resourceResultSet 一起使用,以更安全的方式自动关闭它:在您的实现中,如果没有错误,您只会关闭 ResultSet

如果您坚持使用 Java 6,您应该使用以下习惯用法:

   ResultSet rs = null;
try {
rs = ...; // obtain rs
// do whatever
} finally {
if (null != rs) {rs.close();}
}

关于java - 如何实现通用接口(interface)的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com