J'a récemment été mordue par un bug dans lequel j'avais une carte de type clé Long code>, mais je tenté de l'utiliser avec des touches de type
String code>. Je essentiellement eu quelque chose comme:.
Map<Long, Object> map;
...
String wrongType;
if (map.containsKey(wrongType)) {
// Do something
} else {
// Do something different
}
3 Réponses :
La raison pour laquelle la carte code> Méthodes code> Malheureusement, il n'y a pas de protection / avertissement de compilateur contre appelant ces méthodes avec le mauvais type. P> get () code> et
contient () code> prend
objet code> (et pas le Type de la clé) Est-ce que les génériques pré-datent et doivent être compatibles vers l'arrière, les signatures devaient rester de cette façon. P>
+1: Ne résout pas mon problème, mais merci pour l'information.
FWIW, un jour après cette question a été publié pour la première fois et maintenant (2019), une analyse supplémentaire a été ajoutée. Ce type de code suscitera un "type d'argument improbable" d'avertissement de plusieurs compilateurs et IDes de nos jours, si i> le type de clé est connu à la compilation.
Vous pouvez écrire une méthode utilitaire générique qui fournira une sécurité de type:
//These compile fine boolean result1 = safeContainsKey(map, 12345l); Object obj1 = safeGet(map, 12345l); //These cause compilation errors boolean result2 = safeContainsKey(map, "12345"); Object obj2 = safeGet(map, "12345");
Bonnes suggestions. Je vais définitivement vérifier CodePro Analytix, ressemble à ce dont j'ai besoin et plus encore.
Findbugs a un test pour cela: gc_unrelated_types p>
Running Findbugs sur votre code devrait révéler cela et beaucoup d'autres choses aussi; -) p>
Je préfère considérablement l'analyse de CodePro selon Google sur Findbugs. Malgré le nom terrible, c'est un outil bien meilleur.
+1: bonne réponse, mais finalement, je préférerai celui que je peux utiliser dans Eclipse.
Sonar a averti de cela si je me souviens bien. Il est bon d'avoir un Hudson CI et sonar, mis en place pour un projet Java, cela rend la vie beaucoup plus facile ...
duplicaté possible de Quelles sont les raisons pour lesquelles Map.get (clé d'objet) n'est pas (entièrement) générique
Utilisez Intellij qui vous avertit à ce sujet.