J'ai une méthode qui accepte un objet. Dans un cas d'utilisation, la méthode accepte un HashMap<String, String>
et définit chaque valeur sur la propriété du nom de clé correspondant.
public void addHelper(Object object) {
if (object instanceof HashMap) {
HashMap<String, String> hashMap = (HashMap<String, String>) object;
this.foo = hashMap.get("foo");
this.bar = hashMap.get("bar");
}
}
Cette classe adhère à une interface particulière, donc l'ajout de setters pour ces propriétés n'est pas une option.
Ma question est, comment puis-je vérifier le type de fonte ici?
HashMap<String, String> hashMap = (HashMap<String, String>) object;
Merci d'avance!
[[# #]] solution [~ # ~]
Grâce à la réponse de @drobert, voici mon code mis à jour:
public void addHelper(Object object) {
if (object instanceof Map) {
Map map = (Map) object;
if (map.containsKey("foo")) this.foo = map.get("foo").toString();
if (map.containsKey("bar")) this.bar = map.get("bar").toString();
}
}
Tu ne peux pas. En raison de l'effacement des types, la réflexion montrera que vous avez une instance de HashMap, mais les types sont supprimés au moment de l'exécution. En effet, vous avez HashMap <Object, Object>.
Cela dit, vous avez encore quelques options et quelques conseils que je vous suggère de prendre. Parmi eux:
En bref: traitez cela comme n'importe quelle carte, et essayez d'accéder aux clés comme des chaînes même sans le cast, et essayez d'utiliser chaque valeur comme une chaîne en effectuant une vérification nulle puis en appelant .toString () et vous aurez beaucoup plus de sécurité la mise en oeuvre.
Il convient de noter que la routine d'origine est exactement équivalente au codage
public void addHelper(Object object) {
if (object instanceof HashMap) {
HashMap hashMap = (HashMap) object;
this.foo = (String)(hashMap.get("foo"));
this.bar = (String)(hashMap.get("bar"));
}
}
Le cast explicite (HashMap)
Ne peut pas générer d'erreur, car il est gardé par le instanceof
. Les transtypages (String)
Fournis implicitement ne génèrent une erreur que si les valeurs renvoyées par HashMap ne sont pas des chaînes (ou des valeurs nulles).
(Par "exactement équivalent à", je veux dire que le même bytecode est produit.)
Vous devez utiliser try-catch, où vous appelez la méthode addHelper(Object)
. Cela garantira votre type correct de HashMap
.
try{
addHelper(hashMap);
}
catch(ClassCastException ex){
System.out.println("Is not desired hashmap");
}
try{
HashMap<String, String> hashMap = (HashMap<String, String>) object;
this.foo = hashMap.get("foo");
this.bar = hashMap.get("bar");
}catch(ClassCastException e){
System.err.log("Object is not a hashmap");
}
Maintenant, vous savez que l'objet est du bon type - même une classe abstraite personnalisée ou autre.