2017-08-20 2 views
1

J'ai une classe appelée ZipClass qui contient essentiellement deux méthodes statiques: - ZipToList() pour mettre deux listes de même taille dans les listes des listes; et - ZipToMapList() pour mettre la liste des valeurs en tant que clés et listes de listes en tant que valeurs pour les clés.Java listes imbriquées dans la carte renvoie une erreur lors du passage d'une liste de listes à des valeurs de carte

Première méthode fonctionne très bien:

public static <T> List<List<T>> zipToList(List<T> list1,List<T> list2) 
{ 
    List<T> tuple = new ArrayList<>(); //a list for pair of values from from same columns (fields) 
    List<List<T>> tuples = new ArrayList<>(); // a list of lists 
    if(list1.size() == list2.size()) //check that size of lists the same 
    {   
     for(int idx = 0; idx < list1.size(); idx ++) 
     { 
      //feed tuple with the pair of values 
      tuple.add(list1.get(idx)); 
      tuple.add(list2.get(idx)); 
      //feed list of lists with the list of paired values 
      tuples.add(copyList(tuple)); 
      //clear pair for the next iteration 
      tuple.clear(); 
     } 
    } else System.out.println("Lists must be of same size"); 

    return tuples; 
} 

Ma deuxième méthode:

public static <K,V extends List<?>> Map<K,List<?>> zipToMapList(List<K> keys,List<List<?>> values) 
{ 
    Map<K,List<?>> dataMap = new HashMap<>(); 
    for(int idx = 0; idx < keys.size(); idx ++) 
    { 
     dataMap.put(keys.get(idx), values.get(idx)); 
    } 
    return dataMap; 
} 

J'ai deux listes qui contiennent des valeurs entières: valeurs1 et VALUES2 et j'ai liste des clés qui détient Valeurs de chaîne: touches lorsque j'essaie d'imprimer le contenu de dataMap: System.out.println (zipToMapList (keys, zipToList (values1, values2))); il y a un message d'erreur:

The method zipToMapList(List<K>, List<List<?>>) in the type ZipClass is not applicable for the arguments (List<String>, List<List<Integer>>) 

méthode zipToList() fonctionne très bien, mais je ne peux pas comprendre ce qui se passe exactement dans ma deuxième méthode, je suppose que c'est quelque chose à voir avec:

<K,V extends List<?>> 

Donc "K" est un type de référence générique pour les clés. V étend List et présume contenir tout type de liste et un interne se rapporte à tout type de liste. Après googling, je me rends compte que c'est probablement un moyen illégal, mais je ne comprends pas pourquoi. Quelqu'un peut-il expliquer pourquoi? et quel est le moyen de surmonter ce problème?

Merci beaucoup!

+0

Vous n'utilisez pas 'V' partout dans' zipToMapList' , alors pourquoi en avez-vous besoin? – Eran

Répondre

0

Puisque vous n'utilisez pas le paramètre de type générique V partout dans votre méthode zipToMapList, je vous suggère de l'utiliser pour le type d'élément du List:

public static <K,V> Map<K,List<V>> zipToMapList(List<K> keys,List<List<V>> values) 
{ 
    Map<K,List<V>> dataMap = new HashMap<>(); 
    for(int idx = 0; idx < keys.size(); idx ++) 
    { 
     dataMap.put(keys.get(idx), values.get(idx)); 
    } 
    return dataMap; 
} 
+0

merci pour celui-là! Mais que faire si je fais '>', puis 'Map >'. Dans ce cas, j'utilise ArrayList de type V List mais il en résulte toujours la même erreur? – Vlad

+0

@Vlad Je crois que vous ne devriez pas utiliser un caractère générique. Au lieu de '>' vous pouvez écrire '>' et vous pouvez alors utiliser 'Map >'. Bien sûr, je ne vois toujours pas ce que vous avez besoin de "V". – Eran

+0

était en train d'apprendre ce sujet et de jouer avec différentes façons de voir comment les génériques peuvent jouer. Merci beaucoup pour votre aide Eran! – Vlad