Método devolviendo una lista <T> con la lista de parámetros <S1>, List <S2>, donde S1 y S2 se extiende T

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 Ay Bse 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 Ase extiende C, Bse 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]
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=197573&siteId=1
Recomendado
Clasificación