我需要从我的函数中获得类似动态返回类型的东西。我这时的代码就像:
@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);
.........;
}
}
使用Generics我想以这样的方式编写方法getSswltData(),而不是返回List<Object>
它应该动态返回List<class name>
,即类类型对象的列表,而不是Object类对象的列表。请注意“类名”是在调用getSswltData()期间传递的类,这将是代码的动态部分。
我很好奇它仍有可能吗?我足够灵活,可以更改代码的任何部分,因此欢迎所有建议。
答案 0 :(得分:2)
至于可能的签名:
<T> List<T> getSswltData(String tableName, String sql, Class<T> className)
这样,您可以将返回值定义为您作为参数传递的类的实例列表。
在内部,您可能需要进行一些演员表/转换,因为我猜测jdbcTemplate.query(sql, new BeanPropertyRowMapper(className));
只返回List<Object>
。如果您非常确定您确实获得了List<T>
,那么您可以尝试转换为原始类型List
,然后转换为List<T>
,但是您可以使用let oldRecords = [
{name: 'john'},
{name: 'ringo'}
];
let newRecords = [
{name: 'paul'},
{name: 'john'},
{name: 'stuart'}
];
。我需要注意,如果返回的元素与传递的类不匹配,你可能会很难发现bug。