gpt4 book ai didi

java - Stream 而不是 Stream 在列表上调用时产生
转载 作者:行者123 更新时间:2023-12-04 07:44:13 25 4
gpt4 key购买 nike

我有这个方法:

public static <T,U,R> Stream<R> cartesian(
List<? extends T> list1,
List<? extends U> list2,
BiFunction<? super T, ? super U, R> func)
{
return list1.stream() // list1.stream() produces Stream<Object> not Stream<? extends T>!
.flatMap(x -> {
return list2.stream()
.map(appendable ->x + "" +appendable);
});
}
由于以下错误,我的整个管道现在返回 Stream<Object>而不是预期的 Stream<R> .
出现我用箭头指示的错误的任何原因?

最佳答案

“预期类型:...实际类型:...”消息不是关于 list1.stream() ,它是关于您在 flatMap 中的 lambda 中返回的值.观察红色曲线的位置:
enter image description here
据说x -> ...中的代码lambda 返回 Stream<Object> ,而不是预期的 Stream<R> .
请注意 map(spendable -> x + "" + appendable)完全可以返回一个Stream<Object>使用正确的类型参数(例如,如果它是 .<Object>map(appendable ->x + "" +appendable))。
实际上,“预期类型:...实际类型:...”消息仅由 IntelliJ 生成,因此可能只是 IntelliJ 有点傻。如果您运行 javac ,你会得到一个更好的错误信息:

incompatible types: inference variable R#1 has incompatible bounds
.flatMap(x -> {
^
equality constraints: R#2
lower bounds: R#3,String
where R#1,T#1,R#2,T#2,U,R#3 are type-variables:
R#1 extends Object declared in method <R#1>flatMap(Function<? super T#1,? extends Stream<? extends R#1>>)
T#1 extends Object declared in interface Stream
R#2 extends Object declared in method <T#2,U,R#2>cartesian(List<? extends T#2>,List<? extends U>,BiFunction<? super T#2,? super U,R#2>)
T#2 extends Object declared in method <T#2,U,R#2>cartesian(List<? extends T#2>,List<? extends U>,BiFunction<? super T#2,? super U,R#2>)
U extends Object declared in method <T#2,U,R#2>cartesian(List<? extends T#2>,List<? extends U>,BiFunction<? super T#2,? super U,R#2>)
R#3 extends Object declared in method <R#3>map(Function<? super T#1,? extends R#3>)
这表示类型参数 RflatMap不能推断,因为它的边界不能同时满足。 RflatMap必须与 R 相同在 cartesian ,但它的下限是 Rmap , 和 String .
无论如何,您想要做的似乎是:
return list1.stream()
.flatMap(x -> list2.stream().map(y -> func.apply(x, y)));

关于java - Stream<Object> 而不是 Stream<? extends T> 在列表上调用时产生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67278576/

25 4 0