猿问

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

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


qq_花开花谢_0
浏览 392回答 2
2回答

翻阅古今

我认为这是泛型的一个令人困惑的选择。我建议你这样做:private Dao dao;private List<Data> getList() {&nbsp; &nbsp; return this.dao.getDataList();&nbsp;}

桃花长相依

我猜您必须在实际代码中对 (T) 进行强制转换,如下所示。&nbsp; &nbsp; private <T> T getList(Dao myDao)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; T result = (T) myDao.getDataList(); // myDao.getDataList return List<Data>&nbsp; &nbsp; &nbsp; &nbsp; return result;&nbsp; &nbsp; }如果是,代码将编译正常。您将 getList 方法定义为返回类型为 T 的对象。Java 将允许您将某些内容强制转换为 'T',尽管有警告。因为在方法定义中没有对 T 的约束。它相当于“对象”,即您的方法类似于“ private Object getList(Dao myDao){...}”在这种情况下,返回值可以是列表或映射或 Object 的任何子类。基本上,您没有指定“T”代表什么。例如,如果您说“ <T extends List>”,则返回类型必须是列表的子类。另一种方法可以重新编写该方法,并清楚地了解 T:private <T extends Object> T getList(Dao myDao){&nbsp; &nbsp; T result = (T) myDao.getDataList();&nbsp;&nbsp; &nbsp; // Warning Type safety: Unchecked cast from List<Data> to T&nbsp; &nbsp; return result;}
随时随地看视频慕课网APP

相关分类

Java
我要回答