在以下代码中,我碰巧使用了<T>
而不是List<T>
,并且有效。
编辑(抱歉,未编译代码):
private <T, DAO> T getList(Class<Dao> clazz, Function<Dao, T> op) {
Jdbi jdbi = Jdbi.create("jdbc:h2:mem:test");
Handle handle = jdbi.open();
DAO dao = handle.attach(clazz);
T result = op.apply(myDao);
return result;
}
List<Data> getDataList() {
return getList(MyDao.class, MyDao::getDataList); //myDao.getDataList return List<Data>
}
我不明白为什么<T>
没有出错。谁能告诉我为什么?
答案 0 :(得分:2)
我认为这是泛型的一个令人困惑的选择。
我建议您改为这样做:
private Dao dao;
private List<Data> getList() {
return this.dao.getDataList();
}
答案 1 :(得分:-1)
我想您必须像下面的实际代码中所示强制转换为(T)。
private <T> T getList(Dao myDao)
{
T result = (T) myDao.getDataList(); // myDao.getDataList return List<Data>
return result;
}
如果是,则代码将正常编译。您将getList方法定义为返回T类型的对象。Java将允许您将某些内容强制转换为“ T”,尽管有警告。
因为方法定义中对T没有限制。它等效于“对象”,即您的方法类似于“ private Object getList(Dao myDao){...}
”
在这种情况下,返回值可以是list或map或Object的任何子类。
基本上,您没有指定“ T”的含义。例如,如果您说“ <T extends List>
”,那么返回类型必须是列表的子类。
另一种可以重新编写该方法的方法,可以使T更加清晰>
private <T extends Object> T getList(Dao myDao)
{
T result = (T) myDao.getDataList();
// Warning Type safety: Unchecked cast from List<Data> to T
return result;
}