避免使用泛型进行未经检查的转换

时间:2018-08-03 16:21:17

标签: java generics

我想了解有关泛型的更多信息,因此我决定编写一个简单的应用程序。它允许使用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")

1 个答案:

答案 0 :(得分:2)

  

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

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

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

需要更改为:

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