italktothewind:
Tengo este método:
public static <T> List<T> flat(List<T>... lists){
return Stream.of(lists)
.filter(Objects::nonNull)
.flatMap(List::stream)
.collect(toList());
}
La idea es plana una lista de listas y devolver una lista con el mismo tipo.
Supongamos que A
y B
se extiende C
. Esto no funciona:
List<A> listOfA;
List<B> listOfB;
List<C> listOfC = flat(listOfA, listOfB);
Debido a que List<A>
no es una List<C>
!
Alguien sabe cómo escribir una firma de método plana con los genéricos que admite lo que estoy tratando de hacer?
¡Gracias!
Xingbin:
Si A
se extiende C
, B
se extiende C
, a continuación, List<A>
y List<B>
son asignables a List<? extends C>
.
Así se puede declarar de esta manera:
public static <T> List<T> flat(List<? extends T>... lists)
Prueba:
public static void main(String[] args) {
List<String> listOfString = List.of("sss"); // String extends from Object
List<Integer> listOfInt = List.of(1); // Integer extends from Object
List<Object> list = flat(listOfString, listOfInt);
System.out.println(list); // [sss, 1]
}