簡體   English   中英

使用泛型避免未經檢查的強制轉換

[英]Avoiding unchecked casting using 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")

首先,我嘗試使用類型參數(T)來泛化代碼。 但是,我的代碼甚至無法編譯。 為什么?

不允許使用類的實例參數化類型,但必須使用類型本身:

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

需要改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM