10
votes

Java: compilateur ou éclipse AVERTISSEMENT Lorsque vous essayez d'utiliser le type de type comme clé de la carte

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 commentaires

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.


3 Réponses :


3
votes

La raison pour laquelle la carte Méthodes get () et contient () prend objet (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.

Malheureusement, il n'y a pas de protection / avertissement de compilateur contre appelant ces méthodes avec le mauvais type.


2 commentaires

+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 le type de clé est connu à la compilation.



4
votes

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");


1 commentaires

Bonnes suggestions. Je vais définitivement vérifier CodePro Analytix, ressemble à ce dont j'ai besoin et plus encore.



7
votes

Findbugs a un test pour cela: gc_unrelated_types

Running Findbugs sur votre code devrait révéler cela et beaucoup d'autres choses aussi; -)


2 commentaires

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.