692 Stimmen

Wie gehe ich mit ungeprüften Besetzungswarnungen um?

Eclipse gibt mir eine Warnung der folgenden Form:

Typ Sicherheit: Ungeprüfter Cast von Object nach HashMap

Dies stammt aus einem Aufruf an eine API, über die ich keine Kontrolle habe und die Object zurückgibt:

HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
  HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");
  return theHash;
}

Ich möchte Eclipse-Warnungen nach Möglichkeit vermeiden, da sie theoretisch zumindest auf ein potenzielles Codeproblem hinweisen. Ich habe allerdings noch keine gute Möglichkeit gefunden, dieses Problem zu beseitigen. Ich kann die einzelne betroffene Zeile in eine eigene Methode auslagern und Folgendes hinzufügen @SuppressWarnings("unchecked") zu dieser Methode, wodurch die Auswirkungen eines Codeblocks, in dem ich Warnungen ignoriere, begrenzt werden. Gibt es bessere Möglichkeiten? Ich möchte diese Warnungen in Eclipse nicht ausschalten.

Bevor ich zu dem Code kam, war es einfacher, aber es gab trotzdem Warnungen:

HashMap getItems(javax.servlet.http.HttpSession session) {
  HashMap theHash = (HashMap)session.getAttribute("attributeKey");
  return theHash;
}

Das Problem war, dass an anderer Stelle, wenn man versuchte, den Hash zu verwenden, Warnungen angezeigt wurden:

HashMap items = getItems(session);
items.put("this", "that");

Type safety: The method put(Object, Object) belongs to the raw type HashMap.  References to generic type HashMap<K,V> should be parameterized.

0 Stimmen

Wenn Sie HttpSession auf diese Weise verwenden, lesen Sie den Artikel von Brian Goetz zu diesem Thema: ibm.com/developerworks/library/j-jtp09238.html

0 Stimmen

Wenn ein ungeprüfter Cast unvermeidbar ist, ist es eine gute Idee, ihn mit etwas zu koppeln, das seinen Typ logisch repräsentiert (wie ein enum oder sogar Instanzen von Class<T> ), so dass Sie einen Blick darauf werfen können und savoir es ist sicher.

4 Stimmen

0voto

Rick Punkte 4259

Überprüfen Sie einfach die Eingabe, bevor Sie sie machen.

Object someObject = session.getAttribute("attributeKey");
if(someObject instanceof HashMap)
HashMap<String, String> theHash = (HashMap<String, String>)someObject;  

Und für alle, die es wissen wollen: Es kommt durchaus vor, dass man Gegenstände erhält, bei denen man sich nicht sicher ist, um welche Art es sich handelt. Viele alte "SOA"-Implementierungen geben verschiedene Objekte weiter, denen man nicht immer trauen sollte. (Der Schrecken!)

EDITAR Ich habe den Beispielcode einmal geändert, um mit den Aktualisierungen des Posters übereinzustimmen, und nach einigen Kommentaren sehe ich, dass instanceof nicht gut mit Generics zusammenspielt. Die Änderung der Prüfung, um das äußere Objekt zu validieren, scheint jedoch gut mit dem Befehlszeilen-Compiler zu funktionieren. Überarbeitetes Beispiel jetzt gepostet.

8 Stimmen

Leider machen die Generika das unmöglich. Es ist nicht nur eine HashMap, es ist eine HashMap mit Typinformationen. Und wenn ich diese Informationen eliminiere, verschiebe ich die Warnungen einfach an eine andere Stelle.

-1voto

lukewm Punkte 20889

Dadurch verschwinden die Warnungen...

 static Map<String, String> getItems(HttpSession session) {
        HashMap<?, ?> theHash1 = (HashMap<String,String>)session.getAttribute("attributeKey");
        HashMap<String,String> theHash = (HashMap<String,String>)theHash1;
    return theHash;
}

1 Stimmen

Nein, tut es nicht. Tatsächlich werden dadurch zwei Warnungen erzeugt, wo vorher nur eine war.

0 Stimmen

Ah, okay. Ich weiß nicht, warum ich das dachte.

-6voto

Marc Riehm Punkte 35

Lösung: Deaktivieren Sie diese Warnung in Eclipse. Nicht @SuppressWarnings es, nur deaktivieren Sie es vollständig.

Mehrere der oben vorgestellten "Lösungen" sind völlig daneben und machen den Code unlesbar, nur um eine dumme Warnung zu unterdrücken.

11 Stimmen

Darf ich fragen, warum? Durch die globale Deaktivierung einer Warnung werden andere Stellen ausgeblendet, an denen dieses Problem tatsächlich auftritt. @SuppressWarnings macht den Code keineswegs unleserlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X