我想了解有关泛型的更多信息,因此我决定编写一个简单的应用程序。它允许使用CriteriaQuery
检索所有实体的列表。
首先,我尝试使用type parameter
( 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")
。
答案 0 :(得分:2)
首先,我尝试使用类型参数(T)来生成代码。但是,我的代码甚至无法编译。为什么?
不允许您使用类的实例对类型进行参数化,但必须使用类型本身:
CriteriaQuery<t> query = criteriaBuilder.createQuery(t);
需要更改为:
CriteriaQuery<T> query = criteriaBuilder.createQuery(t);