Wie löst man diese Java-Sicherheitswarnung?

8
%Vor%

Dieser Code generiert eine Warnung: Type safety: Die Methode put (Object, Object) gehört zum rohen Typ Map. Verweise auf den generischen Typ Map & lt; K, V & gt; sollte parametrisiert werden .

%Vor%

Dieser Code generiert eine Warnung: Type safety: Deaktivierter Cast von Map to Map & lt; String, Serializable & gt; .

Die Methode getSession gehört zu Struts2 und kann daher nicht geändert werden. Ich möchte vermeiden, @SuppressWarnings zu verwenden, weil andere Warnungen nützlich sein können.

Ich denke, dass alle Struts2-Benutzer auf der Welt demselben Problem gegenüberstanden ... gibt es eine elegante Lösung?

    
Nicolas Raoul 28.05.2010, 07:42
quelle

6 Antworten

8

Ich glaube nicht, dass es einen anderen Weg als @SuppressWarnings ("unchecked") gibt. Ich glaube, du kannst es direkt über die fragliche Zeile setzen und es wird nur diese Zeile unterdrücken.

Bearbeiten: Sie können auch Map<?, ?> session = ActionContext.getContext().getSession(); machen, aber ich bin mir nicht sicher, wie bereit Sie das tun sollen; Sie werden nicht in der Lage sein, etwas so in die Karte zu schreiben (da der Compiler nicht überprüfen kann, was Sie gerade schreiben), lesen Sie nur davon.

    
Andrei Fierbinteanu 28.05.2010, 07:57
quelle
3

Der sicherste und effizienteste Weg, um damit umzugehen, ist wahrscheinlich:

%Vor%

und geben Sie dann die aus der Sitzungszuordnung abgerufenen Objekte ein.

Der @SuppressWarnings-Ansatz führt tatsächlich zu kompiliertem Code, der identisch ist. Die Typumwandlung ist jedoch implizit; d.h. es wird nicht leicht zu erkennen sein, wenn man den Quellcode betrachtet. Und die Annotation @SuppressWarnings könnte (hypothetisch) eine andere Warnung im selben Codeblock unterdrücken, die einen echten Fehler darstellt. d. h. einer, der dazu führt, dass eine der versteckten Typumwandlungen usw. zur Laufzeit fehlschlägt.

Andere teurere Alternativen sind:

  • ein Eintrag nach Eintragskopie von Map<?, ?> in eine neue Map<String, Serializable> -Instanz, wobei die Schlüssel und Werte nach String bzw. Serializable oder

  • umgewandelt werden
  • Eine generische Methode wie die folgende, die die Typumwandlung sicher durchführt.

%Vor%     
Stephen C 28.05.2010 12:03
quelle
1

Welche Version von Struts 2 (besonders XWork ) benutzt du? Für mich gibt der folgende Code einen Fehler:

%Vor%

Dies funktioniert auf der anderen Seite und gibt keine Warnungen:

%Vor%     
Tommi 28.05.2010 08:10
quelle
0

Was ist, wenn Sie es so machen:

%Vor%     
zed_0xff 28.05.2010 07:45
quelle
0

Es fordert Sie auf, den Wert zu parametrieren, wenn der Wert Parameter benötigt, und diese dann übergeben.

Zum Beispiel

%Vor%

gibt eine Warnung für "parametrisiert" Map<Integer, Map> .

Das richtige Format lautet also:

%Vor%     
user3828314 11.07.2014 07:03
quelle
0

Darsteller wie folgt,

%Vor%     
Satish Shah 20.03.2015 08:00
quelle

Tags und Links