Ich versuche, eine Methode zu schreiben, die jede List of List als Parameter akzeptiert - unabhängig vom Typ der verschachtelten Liste.
Bei einer Methode, die eine einzelne Liste eines beliebigen Typs verwendet, funktioniert der Platzhaltertyp gut (siehe Beispiel 1). Dieses Konzept erstreckt sich jedoch nicht auf eine Liste von Listen. Wie in Beispiel 2 zu sehen ist, akzeptiert die Methode dann nur Parameter vom Typ List<List<?>>
, jedoch nicht von einem bestimmten Typ wie List<List<Integer>>
. Beispiel3 verwendet einen Typparameter T
und akzeptiert List<List<Integer>>
, akzeptiert aber nicht mehr List<List<?>>
. Warum ist das und wie kann ich eine Methode schreiben, die sowohl List<List<?>>
als auch List<List<Integer>>
akzeptiert?Generische Typen und Platzhalter in verschachtelten Listen
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) {}
[Diese Frage] (https://stackoverflow.com/questions/12861726/why-cant-you-have-a-listliststring-in-java) geht leicht über die Frage hier . Lange Rede kurzer Sinn, Sie müssen nur 'List> 'für' example2' und ebenso 'List erweitert Liste extends T>> 'für' example3'. Generika können sehr wählerisch sein. –
Obicere