Die Vermeidung unkontrolliert Gießen die Verwendung von Generika

menteith:

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").

Jacob G.:

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);

Ich denke du magst

Origin http://43.154.161.224:23101/article/api/json?id=182224&siteId=1
Empfohlen
Rangfolge