Ich bin ein Neuling im Ruhezustand und schreibe eine einfache Methode, um eine Liste von Objekten zurückzugeben, die einem bestimmten Filter entsprechen. List<Foo>
schien ein natürlicher Rückgabetyp zu sein.
Was auch immer ich tue, ich kann den Compiler nicht glücklich machen, es sei denn, ich beschäftige einen hässlichen @SuppressWarnings
.
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
public class Foo {
public Session acquireSession() {
// All DB opening, connection etc. removed,
// since the problem is in compilation, not at runtime.
return null;
}
@SuppressWarnings("unchecked") /* <----- */
public List<Foo> activeObjects() {
Session s = acquireSession();
Query q = s.createQuery("from foo where active");
return (List<Foo>) q.list();
}
}
Das würde ich gerne loswerdenSuppressWarnings
. Aber wenn ich das tue, bekomme ich die Warnung
Warning: Unchecked cast from List to List<Foo>
(Ich kann es ignorieren, aber ich möchte es gar nicht erst bekommen), und wenn ich das Generikum entferne, um es dem .list()
Rückgabetyp anzupassen , erhalte ich die Warnung
Warning: List is a raw type. References to generic type List<E>
should be parameterized.
Ich bemerkte , dass org.hibernate.mapping
tut ein erklären List
; aber es ist insgesamt ein anderer Typ - Query
gibt a java.util.List
als Rohtyp zurück. Ich finde es seltsam, dass ein neuerer Ruhezustand (4.0.x) keine parametrisierten Typen implementiert, daher vermute ich, dass ich stattdessen etwas falsch mache.
Es sieht dem Ergebnis von Cast Hibernate für eine Liste von Objekten sehr ähnlich , aber hier habe ich keine "harten" Fehler (das System kennt den Typ Foo und ich verwende keine SQLQuery, sondern eine direkte Abfrage). Also keine Freude.
Ich habe auch betrachtet Hibernate Class Cast Exception , da es viel versprechend aussah, aber dann merkte ich , dass ich nicht wirklich bekommen jede Exception
... mein Problem ist nur , dass eine Warnung - eine Codierung Stil, wenn man so will.
Die Dokumentation auf jboss.org, Hibernate-Handbücher und einige Tutorials scheinen das Thema nicht so detailliert zu behandeln (oder ich habe nicht an den richtigen Stellen gesucht?). Wenn sie ins Detail gehen, verwenden sie On-the-Fly-Casting - und dies in Tutorials, die nicht auf der offiziellen jboss.org-Website waren, also bin ich etwas vorsichtig.
Der einmal kompilierte Code läuft ohne offensichtliche Probleme ... von denen ich weiß ... bis jetzt; und die Ergebnisse sind die erwarteten.
Also: mache ich das richtig? Vermisse ich etwas Offensichtliches? Gibt es einen "offiziellen" oder "empfohlenen" Weg, dies zu tun ?