ネストされたリストのタイプに関係なく、リストのリストをパラメータとして取るメソッドを記述しようとしています。
任意のタイプの単一のリストを取る方法の場合、ワイルドカード型は正常に機能します(例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) {}
[この質問](https://stackoverflow.com/questions/12861726/why-cant-you-have-a-listliststring-in-java)少しここでの問題を乗り越えます。長い話をすると、 'List <? extends example2'と同様に 'List <?リスト extends T>>を 'example3'のために拡張します。ジェネリックスは本当に厄介なことがあります。 – Obicere