我有一个方法返回一个Stream
类型的A
。我也有一个亚型B
of A
。该方法创建一个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
}
}
谢谢霍尔格澄清事实。这是泛型类型的类型推断尚未扩展为的情况链式调用因为它会带来额外的复杂性。所以一旦你链接了filter()
调用时,推理机制无法再自动确定类型。
你不需要再施展额外的笨拙.map(A.class::cast)
, 修改返回类型 to Stream<? extends A>
或执行除在中指定泛型类型之外的任何其他操作map()
call
return ints.stream().<A>map(B::new).filter(b -> true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)