[英]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.