java - 使用泛型避免未经检查的转换

标签 java generics

我想学习更多关于泛型的知识,为此我决定编写一个简单的应用程序。它允许使用 CriteriaQuery 检索所有实体的列表。

首先,我尝试使用类型参数 (T) 生成代码。但是,我的代码甚至无法编译。为什么?

private static <T> List<T> retrieveAllT(Session session, 
    CriteriaBuilder criteriaBuilder, T t) {
        CriteriaQuery<t> query = criteriaBuilder.createQuery(t);
        Root root = query.from(t);
        query.select(root);
        return session.createQuery(query).getResultList();
    }

我想到了另一个解决方案。它工作正常,但编译器通知我有关未经检查的转换。 我明白其中的原因,但我想知道是否有可能以更优雅的方式编写这段代码(即没有未经检查的转换)?如果是这样,我该怎么做?

private static List<?> retrieveAll(Session session,
    CriteriaBuilder criteriaBuilder, Class clazz) {
        CriteriaQuery query = criteriaBuilder.createQuery(clazz);
        Root root = query.from(clazz);
        query.select(root);
        return session.createQuery(query).getResultList();
    }

可以肯定的是,我知道 @SuppressWarnings("unchecked")

最佳答案

First of all, I tried to generify code by using type parameter (T). However, my code will not even compile. Why?

不允许使用类的实例参数化类型,但必须使用类型本身:

CriteriaQuery<t> query = criteriaBuilder.createQuery(t);

需要改为:

CriteriaQuery<T> query = criteriaBuilder.createQuery(t);

关于java - 使用泛型避免未经检查的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51676648/

相关文章:

java - 结果集到集合

swift - 如何将 Struct 类型传递给 func 并返回该 Struct 的列表

java - openTSDB REST API 不存储数据

java - 在实体管理器持久化实体后,无法检索触发器/序列生成的数据

java - 提交响应后无法创建 session

java - 比较元素列表和字符串数组

一般递归自类型值的 Java 字段类型?

java - 在java中实现嵌套泛型

swift - 从任何使用具有关联类型的协议(protocol)推断泛型

java - 泛型和 Class.asSubclass