具有泛型类型的 Java collect() 流

Nat*_*ati 1 java generics collections java-stream

有没有办法collect()从 a获取通用项目stream

这就是我想做的...

private <T extends Data> List<Response<T>> validateAndGetResponses(List<Response> responses, Class<T> clazz) {
        Supplier<List<Response<T>>> supplier = LinkedList::new;

        List<Response<T>> list = responses.stream().filter(
                response -> clazz.isInstance(getData(response))).collect(Collectors.toCollection(supplier));
        return list;

}
Run Code Online (Sandbox Code Playgroud)

这不起作用,我明白了

no suitable method found for collect(....)

fab*_*cci 5

因此,如果代码的目的确实是根据类型参数过滤 Response 对象,那么对解决方案的猜测可能是:

@SuppressWarnings("unchecked")
private <T extends Data> List<Response<T>> validateAndGetResponses(List<Response<? extends Data>> responses, Class<T> clazz) {
    return responses.stream()
            .filter(response -> clazz.isInstance(getData(response)))
            .map(response -> (Response<T>) response)
            .collect(Collectors.toCollection(LinkedList::new));
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*ati 5

所以问题是我使用原始类型List<Response> responses作为参数,尽管我确实应该使用通配符边界List<Response<? extends Data>> responses.

这是完整的方法:

@SuppressWarnings("unchecked")
private  <T extends Data> List<T> validateAndGetResponses(List<Response<? extends Data>> responses, Class<T> clazz) {
    return responses.stream().map(this::getData)
                             .filter(clazz::isInstance)
                             .map(r -> (T) r)
                             .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)