Itérer sur une carte entryset
J'ai besoin pour effectuer une itération sur l'entrée de la valeur d'une carte à partir de laquelle je ne sais pas son type paramétré.
Lors de l'itération sur ces entryset, pourquoi cela ne compile pas ?
public void myMethod(Map anyMap) {
for(Entry entry : anyMap.entrySet()) {
...
}
}
mais cette compilation:
public void myMethod(Map anyMap) {
Set<Entry> entries = anyMap.entrySet();
for(Entry entry : entries) {
...
}
}
et cette compile également (je ne peux pas l'utiliser car je ne sais pas le type de la carte):
public void myMethod(Map<String, String> stringMap) {
for(Entry<String,String> entry : stringMap.entrySet()) {
...
}
}
source d'informationauteur Sergio | 2013-02-18
Vous devez vous connecter pour publier un commentaire.
L'erreur que vous obtenez dans votre première:
C'est parce que le compilateur convertit vos EN boucle:
:
Votre deuxième exemple fonctionne, mais seulement par le biais de la triche! Vous faites un pas cochée fonte pour obtenir
Set
retour dans unSet<Entry>
.Devient:
Mise à jour
Comme mentionné dans les commentaires, les informations de type de se perdre dans les deux exemples: parce que le compilateur de la crue de type d'effacement règles.
Pour fournir une compatibilité ascendante, TOUS méthodes de premières instances de type sont remplacés par leur effacé homologues. Ainsi, parce que votre
Map
est une crue de type, tout cela est effacé. Y compris sesSet<Map.Entry<K, V>> entrySet();
méthode: votre première instance de type sera obligé d'utiliser le effacé version:Set entrySet()
.C'est parce que vous utilisez la crue de type de Carte, donc la carte.entrySet() obtient un non-paramétrées Ensemble qui, en retour, les rendements sur l'Objet d'itération, pas d'Entrée.
Un simple, mais élégante solution est d'utiliser Map<?,?>, ce qui sera toujours vous permettent de passer TOUTE la Carte, mais d'un autre côté, les forces de la carte.entrySet() pour retourner une valeur de Set<Entrée>:
Dans le premier exemple, la carte.entrySet() retourne Ensemble, lorsque vous effectuer une itération dans la boucle que vous utilisez Itérateur. Il n'y a aucune information sur le type de contenu d'ensemble, donc Java utiliser l'Objet comme Objet est un type de base et le compilateur vous dit qu'il ne peut pas convertir un Objet à l'Entrée.
Lorsque vous utilisez raw type de carte, entrySet retourne venez de Définir, avec aucun type d'information.
Dans le deuxième exemple, vous convertir à la main Set de Set<Entrée> (avec avertissement). Maintenant Java sait qu'à l'intérieur. De sorte que vous pouvez parcourir.
Dans le dernier exemple, vous savez le type de carte, de sorte entrySet retourne corriger tapé Ensemble et vous pouvez parcourir sans aucun type de conventions.
le premier extrait de code habitude de compiler, car la variable
map
n'existe pas. Vous avez appelé le paramètreanyMap
mais essayé d'y accéder commemap
de le corriger et de votre code compiler mis à part quelques rawtypes avertissementsQue vous obtenez le temps de compilation rrror parce que vous ne spécifiez pas le type en
HashMap
Comme
Si vous spécifiez le type Integer et String, vous n'obtenez pas l'erreur de compilation.
SI vous Ne Savez pas quelle Valeur va Ajouter dans votre table de hachage puis Vous Utilisez
Que j'ai rencontré le même problème. Il semble que le casting est un problème. J'ai essayé le code ci-dessous et cela a fonctionné.