gpt4 book ai didi

java - 过滤后无法返回子类对象的Stream

转载 作者:行者123 更新时间:2023-12-01 16:22:16 26 4
gpt4 key购买 nike

我有一个返回 A 类型的 Stream 的方法。我还有一个 A 的子类型 B。该方法创建一个 Stream,其中填充有 B 的实例,由于继承,这些实例也是 A 类型。这工作得很好,直到我在 Stream 上引入一个过滤器。然后,编译器确定 Stream 的类型为 B 而不是 A,继承似乎并不重要。为什么会出现这种情况?

这是一个最小的可重现示例:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Main {

abstract class A {
int member;
}

class B extends A {

public B(int member) {
this.member = member;
}
}

public static void main(String[] args) {
Stream<A> stream = getStream();
}

private Stream<A> getStream() {
List<Integer> ints = new ArrayList<>();
ints.add(1);
ints.add(2);
ints.add(3);

return ints.stream().map(B::new).filter(b -> true); // Filter causes compiler to throw error
}

}

最佳答案

谢谢霍尔格澄清事实。这是泛型类型的类型推断尚未扩展到 chained invocation 的情况。因为它会带来额外的复杂性。因此,一旦您链接 filter()调用时,推理机制无法再自动判断类型。

你不需要用额外的笨拙的.map(A.class::cast)来施放, modify the return typeStream<? extends A>或者执行除 map() 中指定泛型类型之外的任何其他操作调用

return ints.stream().<A>map(B::new).filter(b -> true);

关于java - 过滤后无法返回子类对象的Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62238705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com