Ich wollte etwas mehr über Generika lernen und zu tun , damit ich eine einfache Anwendung schreiben entschieden. Es ermöglicht Liste aller mit Entitäten abzurufen CriteriaQuery
.
Zunächst einmal habe ich versucht, generify Code unter Verwendung von type parameter
( T ). Allerdings wird mein Code nicht einmal kompilieren. Warum?
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();
}
Ich habe mit einer anderen Lösung zu kommen. Es funktioniert gut, aber der Compiler informiert ich über unkontrolliertes Casting. Ich verstehe den Grund, aber ich würde gerne wissen , ob möglich ist , dieses Stück Code in einer elegantere Art und Weise zu schreiben (dh ohne unkontrollierten Guss)? Wenn ja, wie kann ich das tun?
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();
}
Um sicher zu sein, ich bin mir dessen bewusst @SuppressWarnings("unchecked")
.
Zunächst einmal habe ich versucht, generify Code von Typ-Parameter mit (T). Allerdings wird mein Code nicht einmal kompilieren. Warum?
Sie sind nicht eine Art mit einer Instanz einer Klasse zu parametrieren erlaubt, müssen aber die Art selbst verwenden:
CriteriaQuery<t> query = criteriaBuilder.createQuery(t);
Bedürfnisse werden folgendermaßen geändert:
CriteriaQuery<T> query = criteriaBuilder.createQuery(t);