2013-06-24 4 views
1

Je vais d'abord poster mon code:Comment ajouter à une collection générique <?>?

public static <T> ConcurrentMap<String,Collection<?>> reduceMap(ConcurrentMap<String, ConcurrentHashMap<String, Collection<T>>> map) { 
    ConcurrentMap<String, Collection<?>> smallerMap = new ConcurrentHashMap<String, Collection<?>>(); 
    for (String material : map.keySet()) { 
     for(String genre: map.get(material).keySet()) { 
      if (smallerMap.get(genre) == null) { 
       smallerMap.put(genre, map.get(material).get(genre)); 
      } 
      else { 
       Collection<?> stories = smallerMap.get(genre); 
       for (Object o : map.get(material).get(genre)) { 
        if (!smallerMap.get(genre).contains(o)) { 
         stories.add(o); // error here 
        } 
       } 
       smallerMap.put(genre, stories); 
      } 
     } 
    } 
    return smallerMap; 
} 

L'erreur: The method add(capture#5-of ?) in the type Collection<capture#5-of ?> is not applicable for the arguments (Object)

Exemple de plus grand contenu de la carte:

(reading material -> genre -> stories) 
books -> fiction -> story1,story3 
books -> tale -> story2,story4 
novels-> fiction -> story2, story3 
novels-> tale - > story3 

La plus petite carte qui en résulte devrait avoir:

fiction -> story1,story2,story3 
tales -> story2,story3,story4 

J'essaie pour combiner le contenu d'une carte plus grande dans une carte plus petite. La différence entre les deux cartes est que la plus grande carte a un index externe (le type de matériel de lecture). La plus petite carte contient les mêmes informations que le 2ème index de la carte plus grande (genre). Je veux être capable de combiner ce qui est à l'intérieur du 2ème index de la plus grande carte et de le placer dans la plus petite carte sans le premier index externe. Je souhaite ajouter des doublons aux genres correspondants. Je ne peux pas passer la ligne d'erreur. J'ai essayé de changer le ? en T. Je ne suis pas sûr de quoi d'autre essayer.

EDIT:

Est-il possible de conserver le type de retour de ?.

Répondre

3

Pour le rendre SÛR type, vous devez utiliser le code suivant:

public static <T> ConcurrentMap<String,Collection<T>> reduceMap(ConcurrentMap<String, ConcurrentHashMap<String, Collection<T>>> map) { 
    ConcurrentMap<String, Collection<T>> smallerMap = new ConcurrentHashMap<String, Collection<T>>(); 
    for (String material : map.keySet()) { 
     for(String genre: map.get(material).keySet()) { 
      if (smallerMap.get(genre) == null) { 
       smallerMap.put(genre, map.get(material).get(genre)); 
      } 
      else { 
       Collection<T> stories = smallerMap.get(genre); 
       for (T o : map.get(material).get(genre)) { 
        if (!smallerMap.get(genre).contains(o)) { 
         stories.add(o); // error here 
        } 
       } 
       smallerMap.put(genre, stories); 
      } 
     } 
    } 
    return smallerMap; 
} 
+0

Est-ce que ce retour peut être considéré comme un caractère générique? –

+0

Cela devrait fonctionner, le compilateur n'avait aucun problème avec cela. –

+0

Merci pour l'idée de type sécurité! –

0

Oui, c'est correct. Utilisez Collection<Object> au lieu de Collection<?>.

+0

pour chaque instance de '' Collection ? –

+0

@StephenD Oui, cela devrait fonctionner. Mais certains d'entre eux (par exemple le type de retour de méthode) pourraient être "". – kan

Questions connexes