2017-10-18 14 views
0

ネストされたリストのタイプに関係なく、リストのリストをパラメータとして取るメソッドを記述しようとしています。
任意のタイプの単一のリストを取る方法の場合、ワイルドカード型は正常に機能します(例1を参照)。しかし、この概念はリストのリストには及ばない。例2に示すように、メソッドはList<List<?>>型のパラメータを受け取りますが、List<List<Integer>>などの特定の型のパラメータは受け入れません。例3では、タイプパラメータTを使用し、List<List<Integer>>を受け入れますが、もはやList<List<?>>を受け入れません。これはなぜですか。List<List<?>>List<List<Integer>>の両方を受け入れるメソッドを作成するにはどうすればよいですか?私の作品ネストされたリストの汎用タイプとワイルドカード

public void test() 
{ 
    List<Integer> list1; 
    List<?> list2; 

    example1(list1); // Valid 
    example1(list2); // Valid 

    List<List<Integer>> listOfLists1; 
    List<List<?>> listOfLists2; 

    example2(listOfLists1); // Error 
    example2(listOfLists2); // Valid 

    example3(listOfLists1); // Valid 
    example3(listOfLists2); // Error 
} 

public void example1(List<?> listOfLists) {} 

public void example2(List<List<?>> listOfLists) {} 

public <T> void example3(List<List<T>> listOfLists) {} 
+3

[この質問](https://stackoverflow.com/questions/12861726/why-cant-you-have-a-listliststring-in-java)少しここでの問題を乗り越えます。長い話をすると、 'List <? extends example2'と同様に 'List <?リスト>を 'example3'のために拡張します。ジェネリックスは本当に厄介なことがあります。 – Obicere

答えて

1

example2は動作しません。基本的に、型がワイルドカードによって直接パラメータ化されていない場合、型パラメータは正確に-およびList<?>と正確に一致する必要があります。 (内部にはワイルドカードがありますが、それは具体的なタイプList<?>の一部であり、トップレベルのワイルドカードではありません)

異なるタイプのパラメータを取るためには、ワイルドカードトップレベルで:

public void example4(List<? extends List<?>> listOfLists) {} 
1

List<List<Integer>> listOfLists1; 
List<List<?>> listOfLists2; 

public TestKlasse() { 
    init(); 
} 

public void init(){ 
    listOfLists1 = new ArrayList(); 
    listOfLists2 = new ArrayList(); 
    listOfLists1.add(Arrays.asList(1,2,3,4,5)); 
    listOfLists2.add(Arrays.asList("a","a",2,4,"5")); 
    test((Collection)listOfLists1); 
    test((Collection)listOfLists2); 
} 

private void test(Collection<Collection<?>> list){ 
    list.forEach(e -> { 
     System.out.println(e.toString()); 
    }); 
} 

結果:私は、このソリューションは、あなたの期待に合うことを願っています

[1, 2, 3, 4, 5] 
[a, a, 2, 4, 5] 

List<List<Integer>>List<Integer>List<String>StringObjectのサブタイプであるにもかかわらずList<Object>のサブタイプではなく、どのように類似しList<?>のサブタイプで、あるにもかかわらずList<List<?>>のサブタイプではないので

関連する問題