通过 java 泛型的动态 return 类型
Dynamic return types through java generics
我的函数需要类似动态 return 类型的东西。我此时的代码是这样的:
@Repository
public class SswltDataDAO {
private static final Logger logger = LoggerFactory.getLogger(SswltDataDAO.class);
private JdbcTemplate jdbcTemplate;
@Autowired
@Qualifier("dataSource_sswlt")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Object> getSswltData(String tableName, String sql, Class className) {
List<Object> listOfOblects = null;
try{
listOfOblects = jdbcTemplate.query(sql, new BeanPropertyRowMapper(className));
}catch(Exception e){
logger.error("\n\nException while importing data from "+tableName+":\n", e);
listOfOblects = null;
e.printStackTrace();
}
return listOfOblects;
}
}
这是方法的用法:dataImportFromSswltToIwproImp()
Class MainService {
public boolean dataImportFromSswltToIwproImp() {
.......
List<Object> list = sswltDataDAO.getSswltData("tbl_sswltdata_addresses", "select * from tbl_sswltdata_addresses", SswltdataAddresses.class);
.........;
}
}
使用泛型我想以这样的方式编写方法 getSswltData() 而不是 returning List<Object>
它应该动态地 return List<class name>
即列表 class 类型对象,而不是 Object class 对象。请注意 "Class Name" 是在调用 getSswltData() 期间传递的 Class,这将是代码的动态部分。
我很好奇还能不能?我很灵活,可以更改代码的任何部分,因此欢迎所有建议。
至于可以的签名:
<T> List<T> getSswltData(String tableName, String sql, Class<T> className)
这样您就可以将 return 值定义为作为参数传递的 class 的实例列表。
虽然在内部你可能需要做一些 casts/conversions,因为我猜 jdbcTemplate.query(sql, new BeanPropertyRowMapper(className));
只是 return 是 List<Object>
。如果你非常确定你实际上得到了一个List<T>
,你可以尝试转换为原始类型List
,然后从原始类型转换为List<T>
,但是你'需要注意,如果 returned 元素与传递的 class.
不匹配,您可能会引入难以发现的错误
我的函数需要类似动态 return 类型的东西。我此时的代码是这样的:
@Repository
public class SswltDataDAO {
private static final Logger logger = LoggerFactory.getLogger(SswltDataDAO.class);
private JdbcTemplate jdbcTemplate;
@Autowired
@Qualifier("dataSource_sswlt")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Object> getSswltData(String tableName, String sql, Class className) {
List<Object> listOfOblects = null;
try{
listOfOblects = jdbcTemplate.query(sql, new BeanPropertyRowMapper(className));
}catch(Exception e){
logger.error("\n\nException while importing data from "+tableName+":\n", e);
listOfOblects = null;
e.printStackTrace();
}
return listOfOblects;
}
}
这是方法的用法:dataImportFromSswltToIwproImp()
Class MainService {
public boolean dataImportFromSswltToIwproImp() {
.......
List<Object> list = sswltDataDAO.getSswltData("tbl_sswltdata_addresses", "select * from tbl_sswltdata_addresses", SswltdataAddresses.class);
.........;
}
}
使用泛型我想以这样的方式编写方法 getSswltData() 而不是 returning List<Object>
它应该动态地 return List<class name>
即列表 class 类型对象,而不是 Object class 对象。请注意 "Class Name" 是在调用 getSswltData() 期间传递的 Class,这将是代码的动态部分。
我很好奇还能不能?我很灵活,可以更改代码的任何部分,因此欢迎所有建议。
至于可以的签名:
<T> List<T> getSswltData(String tableName, String sql, Class<T> className)
这样您就可以将 return 值定义为作为参数传递的 class 的实例列表。
虽然在内部你可能需要做一些 casts/conversions,因为我猜 jdbcTemplate.query(sql, new BeanPropertyRowMapper(className));
只是 return 是 List<Object>
。如果你非常确定你实际上得到了一个List<T>
,你可以尝试转换为原始类型List
,然后从原始类型转换为List<T>
,但是你'需要注意,如果 returned 元素与传递的 class.