2017-08-20 9 views
1

私は、基本的に2つの静的メソッドを保持するZipClassというクラスを持っています: - リストに同じサイズの2つのリストを入れるZipToListリストの; - ZipToMapList()は、値のリストをキーとして、リストのリストを値としてキーに格納します。マップ内のJavaネストされたリストは、リストのリストをマップ値に渡すときにエラーを返します

第1の方法は正常に動作します:

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; 
} 

私の第二の方法:

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; 
} 

私は整数値を保持する二つのリストました:values1とvalues2 をし、私が保持しているキーのリストをしました文字列値:キー dataMapの内容を印刷しようとしたとき: System.out.println(zipToMapList(keys、zipToList(values1、values2))); エラーメッセージがあります:

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

zipToList()メソッドはうまく動作しますが、私は正確に私の第二の方法では何が起こっているのか理解できない、私はそれはとは何かだと思う:

<K,V extends List<?>> 

"K"はキーの一般的な参照型です。 VはListを拡張し、任意のタイプのListを保持することを前提とし、innerはListの任意のタイプに関係する。 グーグルでは、これはおそらく違法な方法だとわかっていますが、理由を理解できません。 誰でも理由を説明できますか?この問題を克服する方法は何ですか?

多くの感謝!

+0

あなたはどこにでもzipToMapList' 'で' V'を使用していませんそれでなぜあなたはそれを必要としているのですか? – Eran

答えて

0

あなたはどこでもあなたのzipToMapList方法でジェネリック型パラメータVを使用していないので、私は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

ありがとう!しかし、もし私が '>'を実行し、次に 'Map >'を実行するとどうなりますか?この場合、Vリスト型のArrayListを使用していますが、それでも同じエラーが発生しますか? – Vlad

+0

@Vlad私はあなたがワイルドカードを使用すべきではないと信じています。あなたは '>'と書くことができます。 'Map >'を使うことができます。もちろん、私はまだ 'V'が必要なものは見ません。 – Eran

+0

はこの話題を学んでいて、ジェネリックスがどのように遊びに来るかについてさまざまな方法で遊んでいました。助けてくれてありがとうEran! – Vlad

関連する問題