来自collect()
的{{1}}通用项目是否可以使用?
这就是我想要做的......
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;
}
答案 0 :(得分:2)
因此,如果代码的目的确实是根据类型参数过滤了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));
}
答案 1 :(得分:1)
所以问题是我使用原始类型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());
}