Generics + Map: Duvidas sobre como obter um entry set[Resolvido]
9 respostas
Mantu
Olá pessoal!
Estou criando uma classe que implementa a interface Map. Esta classe, na verdade, delega as implementações das operações da interface Map para um campo do tipo TreeMap. Estou encontrando problemas para obter um entry set deste meu campo. Vejam:
Type mismatch: cannot convert from
Set<Map.Entry<capture-of ? extends ClassMemberUsageDescriptor,capture-of ? extends Long>> to
Set<Map.Entry<ClassMemberUsageDescriptor,Long>>
Realmente não entendi onde está a incompatibilidade. Poderia jurar que
Set<Map.Entry<ClassMemberUsageDescriptor,Long>>
se “encaixava” em Set<Map.Entry<capture-of ? extends ClassMemberUsageDescriptor,capture-of ? extends Long>>
O que estou fazendo de errado?
importjava.util.*;classClassMemberUsageDescriptor{}publicclassClassMemberUsageMapimplementsMap<ClassMemberUsageDescriptor,Long>{privateMap<ClassMemberUsageDescriptor,Long>treeMap;// burocraciapublicSet<Map.Entry><ClassMemberUsageDescriptor,Long>>entrySet(){returntreeMap.entrySet();}publicCollection<Long>values(){returntreeMap.values();}publicSet<ClassMemberUsageDescriptor>keySet(){returntreeMap.keySet();}publicvoidclear(){treeMap.clear();}publicLongremove(Objectobj){returntreeMap.remove(obj);}publicLongput(ClassMemberUsageDescriptorkey,Longvalue){returntreeMap.put(key,value);}publicLongget(Objectkey){returntreeMap.get(key);}publicbooleancontainsValue(Objectvalue){returntreeMap.containsValue(value);}publicbooleancontainsKey(Objectkey){returntreeMap.containsValue(key);}publicbooleanisEmpty(){returntreeMap.isEmpty();}publicintsize(){returntreeMap.size();}// ... etc ...publicClassMemberUsageMap(){treeMap=newTreeMap<ClassMemberUsageDescriptor,Long>();}//...publicvoidputAll(Map<?extendsClassMemberUsageDescriptor,?extendsLong>map){treeMap.putAll(map);/* Erro:found : java.util.Set<java.util.Map.Entry><capture#560 of ? extends ClassMemberUsageDescriptor,capture#309 of ? extends java.lang.Long>>required: java.util.Set<java.util.Map.Entry><? extends ClassMemberUsageDescriptor,? extends java.lang.Long>> */Set<Map.Entry><?extendsClassMemberUsageDescriptor,?extendsLong>>myEntrySet1=map.entrySet();/* Erro:found : java.util.Set<java.util.Map.Entry><capture#684 of ? extends ClassMemberUsageDescriptor,capture#49 of ? extends java.lang.Long>>required: java.util.Set<java.util.Map.Entry><ClassMemberUsageDescriptor,java.lang.Long>> */Set<Map.Entry><ClassMemberUsageDescriptor,Long>>myEntrySet2=map.entrySet();/* Erro:found : java.util.Set<java.util.Map.Entry><capture#552 of ? extends ClassMemberUsageDescriptor,capture#955 of ? extends java.lang.Long>>required: java.util.Set<java.util.Map.Entry><? super ClassMemberUsageDescriptor,? super java.lang.Long>> */Set<Map.Entry><?superClassMemberUsageDescriptor,?superLong>>entrySet3=map.entrySet();/* Erro:found : java.util.Set<java.util.Map.Entry><capture#388 of ? extends ClassMemberUsageDescriptor,capture#640 of ? extends java.lang.Long>>required: java.util.Set<java.util.Map.Entry><?,?>> */Set<Map.Entry><?,?>>entrySet4=map.entrySet();// Não dá erro... Set<?>entrySet5=map.entrySet();// mas não posso fazer isto: entrySet5.addAll(map.entrySet());// nem isto for(Map.Entry<ClassMemberUsageDescriptor,Long>entry:entrySet5){}// pelo jeito temos de usar o mapa sem jogá-lo em uma variável. Isto funcionafor(Map.Entry<?extendsClassMemberUsageDescriptor,?extendsLong>entry:map.entrySet()){System.out.println(entry);}}//...}
Mantu
Mas que coisa, não!!? :shock:
Muito estranho isso!!! :?
Em todo caso, a solução que você encontrou não usando a variável Set já resolve o problema aqui (Como sempre, aliás… :thumbup: ).
Muito obrigado, Thingol!
Mantu
Um cara lá do forum da sun achou o problema. Dá até raiva: