Метод, возвращающий список <T>с параметрами List <S1>, List <S2>, где S1 и S2 расширяет T - PullRequest
0 голосов
/ 27 августа 2018

У меня есть этот метод:

public static <T> List<T> flat(List<T>... lists){
    return Stream.of(lists)
        .filter(Objects::nonNull)
        .flatMap(List::stream)
        .collect(toList());
}

Идея состоит в том, чтобы создать список списков и вернуть список с тем же типом.

Предположим, что A и B расширяются C. Это не работает:

List<A> listOfA;
List<B> listOfB;
List<C> listOfC = flat(listOfA, listOfB);

Потому что List<A> это не List<C>!

Кто-нибудь знает, как написать сигнатуру плоского метода с обобщениями, которые признают, что я пытаюсь сделать?

Спасибо!

1 Ответ

0 голосов
/ 27 августа 2018

Если A расширяется C, B расширяется C, тогда List<A> и List<B> назначаются на List<? extends C>.

Так что вы можете объявить это так:

public static <T> List<T> flat(List<? extends T>... lists)

Тест:

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]
}
...