返回带有参数List <s1>,List <s2>的List <t>的方法,其中S1和S2扩展了T

时间:2018-08-27 15:28:47

标签: java generics inheritance java-stream

我有这种方法:

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

这个想法是将列表的列表放平并返回具有相同类型的列表。

假设AB扩展了C。这不起作用:

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

因为List<A>不是List<C>

任何人都知道如何使用泛型来写一个平面方法签名,该签名承认我想做的事情吗?

谢谢!

1 个答案:

答案 0 :(得分:8)

如果A扩展了CB扩展了C,则List<A>List<B>可分配给List<? extends C>。 / p>

所以您可以这样声明:

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