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

具有泛型类型的Java collect()流,java,generics,collections,java-stream,Java,Generics,Collections,Java Stream,是否有方法从流收集()通用项 这就是我想做的 private <T extends Data> List<Response<T>> validateAndGetResponses(List<Response> responses, Class<T> clazz) { Supplier<List<Response<T>>> supplier = LinkedList::new;

是否有方法从
收集()通用项

这就是我想做的

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;

}
private List validateAndGetResponse(列表响应,类clazz){
供应商=LinkedList::新建;
List=responses.stream().filter(
response->clazz.isInstance(getData(response)).collect(collector.toCollection(supplier));
退货清单;
}
这不管用,我明白了


找不到适合收集(..)的方法

因此,如果代码的目的确实是基于类型参数过滤响应对象,则解决方案的粗略猜测可能是:

@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));
}
@SuppressWarnings(“未选中”)

private List validateAndGetResponses(List因此,如果代码的目的确实是基于类型参数过滤响应对象,那么对解决方案的猜测可能是:

@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));
}
@SuppressWarnings(“未选中”)


私有列表验证数据响应(List所以问题是我使用了原始类型
List responses
作为参数,尽管我确实应该使用通配符边界,
List所以问题是我使用了原始类型
List responses
作为参数,尽管我确实应该使用通配符边界,
列表请发布完整的错误消息。即使你不这样做“我不理解它,它将帮助我们帮助你。这编译得很好。你能发布你的导入吗?我同意@JeffreyBosboom。到目前为止,你编写的代码甚至可以编译得很好。唯一的问题是应该是List的responses参数。@fabriziocucci-这确实是个问题。谢谢!顺便说一句:有时(显然不在这里),返回泛型的方法需要类型提示,这意味着您必须执行
foo.someMethod(..
而不是
foo.someMethod)(..
请发布完整的错误消息。即使你不理解它,它也会帮助我们帮助你。这编译得很好。你能发布你的导入吗?我同意@JeffreyBosboom。到目前为止,你编写的代码编译得很好。唯一的问题是应该是List的responses参数。@fabriziocucci-这确实是个问题。谢谢!顺便说一句:有时(这里不是很明显),返回泛型的方法需要类型提示,这意味着您必须执行
foo.someMethod(…
而不是
foo.someMethod)(..
这让我非常担心。如果他们传递的
列表是
列表怎么办?
?你只是无意中造成了堆污染。他们似乎是基于类型检查进行过滤的,所以这似乎是可能的。OP需要去删除他们代码中的所有内容。对不起,我的错误。@Radiodef写的是真的。因为我是filt根据类型,我的列表并非都是
Response
。更多的是
列表。您需要的可能只是
映射(r->(Response)r)
在您的流中,但您所做的对我来说太模糊,无法在不了解更多信息的情况下提出解决方案。将编译的内容不一定是正确且可证明安全的,特别是当
响应
是可变的时。我想,除非您不关心不安全的通用代码,否则我已经看到过太多这样的代码时间到此为止。@Radiodef响应在这种情况下是不可变的。因此,按类过滤,然后立即转换到正确的类型是我最好的选择?@Radiodef确实提出了一个很好的观点。我也在猜测您编写代码的目的,只是让编译器高兴可能弊大于利!:)但是,是的,如果你只是根据你传递的类文本过滤响应,那么强制转换可能是你唯一的选择。这让我非常担心。如果他们传递的
列表是
列表会怎么样?你只是无意中造成了堆污染。他们似乎是根据类型检查过滤的,所以这是错误的ems可能是。OP需要从他们的代码中删除所有内容。对不起,我错了。@Radiodef写的是真的。因为我是根据类型进行筛选的,所以我的列表不是全部都是
Response
。更多的是
列表。您需要的可能只是
映射(r->(Response)r)
在您的流中,但您所做的对我来说太模糊,无法在不了解更多信息的情况下提出解决方案。将编译的内容不一定是正确且可证明安全的,特别是当
响应
是可变的时。我想,除非您不关心不安全的通用代码,否则我已经看到过太多这样的代码时间到此为止。@Radiodef响应在这种情况下是不可变的。因此,按类过滤,然后立即转换到正确的类型是我最好的选择?@Radiodef确实提出了一个很好的观点。我也在猜测您编写代码的目的,只是让编译器高兴可能弊大于利!:)但是,是的,如果您只是根据传递的类文本筛选响应,那么强制转换可能是您唯一的选择。好的,那么现在您是说您只想返回一个列表而不是列表。这是我的响应的唯一区别,应该可以。好的,那么现在您是说您只想返回一个列表而不是这是我回复的唯一区别,应该没问题。