返回泛型T

时间:2018-08-20 19:39:15

标签: java generics

在以下代码中,我碰巧使用了<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>没有出错。谁能告诉我为什么?

2 个答案:

答案 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;
}