通过 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.

不匹配,您可能会引入难以发现的错误