我想学习更多关于泛型的知识,为此我决定编写一个简单的应用程序。它允许使用 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/