代码之家  ›  专栏  ›  技术社区  ›  menteith

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

  •  5
  • menteith  · 技术社区  · 6 年前

    我想学习更多关于泛型的知识,为此我决定编写一个简单的应用程序。它允许使用 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 回复  |  直到 6 年前
        1
  •  2
  •   Jacob G.    6 年前

    首先,我尝试使用类型参数(T)来泛化代码。但是,我的代码甚至不会编译。为什么?

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

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

    需要更改为:

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