通过java泛型的动态返回类型

时间:2017-02-01 10:01:01

标签: java spring generics spring-jdbc jdbctemplate

我需要从我的函数中获得类似动态返回类型的东西。我这时的代码就像:

@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()期间传递的类,这将是代码的动态部分。

我很好奇它仍有可能吗?我足够灵活,可以更改代码的任何部分,因此欢迎所有建议。

1 个答案:

答案 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。