Wie prüft man Schlüsselarten und Werte, wenn Object instanceof HashMap?

7

Ich habe eine Methode, die ein Objekt akzeptiert. In einem Anwendungsfall akzeptiert die Methode HashMap<String, String> und setzt jeden Wert auf die Eigenschaft des entsprechenden Schlüsselnamens.

%Vor%

Diese Klasse ist an eine bestimmte Schnittstelle gebunden, daher ist das Hinzufügen von Settors für diese Eigenschaften keine Option.

Meine Frage ist, wie kann ich den Typ Cast hier überprüfen?

%Vor%

Vielen Dank im Voraus!

LÖSUNG

Dank der Antwort von @drobert, hier ist mein aktualisierter Code:

%Vor%     
Shaun Scovil 03.10.2013, 15:43
quelle

4 Antworten

17

Sie können nicht. Aufgrund der Typlöschung zeigt die Reflektion an, dass Sie eine Instanz von HashMap haben, aber die Typen werden zur Laufzeit gelöscht. Effektiv haben Sie HashMap & lt; Objekt, Objekt & gt;.

Das heißt, Sie haben immer noch einige Optionen und einen Ratschlag, den ich vorschlagen würde. Unter ihnen:

  • Überprüfen Sie, ob es sich um eine Instanz von "Map" und nicht um "HashMap" handelt. Es wird Ihre API viel flexibler machen, da Sie wahrscheinlich nur darauf achten, dass Sie einen schnellen Zugriff per Schlüssel und nicht über eine bestimmte Implementation haben
  • Nutzen Sie die API von java.util.Map, die 'containsKey (Object)' und 'get (Object)' definiert, so dass Sie mapInst.get ("stringKey") auch dann sicher verwenden können, wenn Sie nicht casten müssen.
  • Sie können nicht sicherstellen, dass alle Werte Zeichenfolgen sind, aber Sie können die Methode toString () von java.lang.Object nutzen und unabhängig davon einen String für jeden Wert erhalten.

Kurz gesagt: Behandle das wie jede Map und versuche, auch ohne die Besetzung auf die Schlüssel als Strings zuzugreifen, und versuche, jeden Wert als String zu verwenden, indem du einen Null-Check durchführst und dann .toString () aufruft eine viel sicherere Implementierung.

    
drobert 03.10.2013, 16:01
quelle
3

Es sollte beachtet werden, dass die ursprüngliche Routine genau der Codierung entspricht

%Vor%

Die explizite (HashMap) -Wiedergabe kann möglicherweise keinen Fehler auslösen, da sie von instanceof geschützt wird. Die implizit bereitgestellten (String) -Abtastungen werden nur dann einen Fehler ausgeben, wenn die von der HashMap zurückgegebenen Werte keine Strings (oder Nullen) sind.

(Mit "genau gleich" bedeutet, dass derselbe Bytecode erzeugt wird.)

    
Hot Licks 03.10.2013 18:05
quelle
1

Sie sollten try-catch verwenden, wo Sie addHelper(Object) method aufrufen. Dadurch wird der korrekte Typ von HashMap sichergestellt.

%Vor%     
Masudul 03.10.2013 15:55
quelle
0
%Vor%

Nun wissen Sie, dass das Objekt vom richtigen Typ ist - sogar eine benutzerdefinierte abstrakte Klasse oder sonst.

    
false_memories 03.10.2013 15:48
quelle

Tags und Links