如何按实例获取列表的所有元素?

我有一个列表,可以具有接口(interface)Foo的任何类实现:

interface Foo;
class Bar implements Foo;

我想使用java8 stream api提供一种实用程序方法,用于提取特定类类型的所有元素:
public static <T extends Foo> List<T> getFromList(List<Foo> list, Class<T> type) {
    return (List<T>) list.stream().filter(entry -> type.isInstance(entry)).collect(Collectors.toList());
}

使用:
List<Foo> list;
List<Bar> bars = Util.getFromList(list, Bar.class);

结果:可以,但是由于@SuppressWarningsunchecked cast,所以我必须添加(List<T>)。如何避免这种情况?

最佳答案

引入另一个扩展S的类型参数是正确的,但是,为了使结果作为List<S>而不是List<T>,您必须对通过.map()谓词传递给type::isInstance的条目进行S

public static <T extends Foo, S extends T> List<S> getFromList(List<T> list, Class<S> type) {
    return list.stream()
               .filter(type::isInstance)
               .map(type::cast)
               .collect(Collectors.toList());
}

正如@Eran所建议的,甚至可以简化为仅使用一个类型参数来工作:
public static <T extends Foo> List<T> getFromList(List<Foo> list, Class<T> type) {
    return list.stream()
               .filter(type::isInstance)
               .map(type::cast)
               .collect(Collectors.toList());
}

09-10 03:30