为了账号安全,请及时绑定邮箱和手机立即绑定

为通用类型 T 返回 List<T>

为通用类型 T 返回 List<T>

qq_花开花谢_0 2021-08-04 10:11:39
我碰巧在下面的代码中使用了<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 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

我认为这是泛型的一个令人困惑的选择。


我建议你这样做:


private Dao dao;


private List<Data> getList() {

    return this.dao.getDataList(); 

}


查看完整回答
反对 回复 2021-08-04
?
桃花长相依

TA贡献1860条经验 获得超8个赞

我猜您必须在实际代码中对 (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){...}”


在这种情况下,返回值可以是列表或映射或 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;

}


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 391 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信