这很可能是JDK-8051402,它是在JDK
8u11之后引入的,发现于JDK 8u20中,但为时已晚,已在JDK 8u20之后进行了修复。该修复程序出现在JDK
8u40早期访问快照内部版本b02和JDK
9早期访问快照内部版本b27中。
这是说明问题的最小化代码片段:
public class X { static Predicate<Number> IS_SYNTHETIC = p -> false; static Predicate<Number> IS_MLS_PROVIDER = p -> true; static void calcSynth(Stream<? extends Number> providers) { Stream<? extends Number> all = providers.filter(Predicates.and(IS_MLS_PROVIDER,Predicates.not(IS_SYNTHETIC))); }}class Predicates { static <T> Predicate<T> and(Predicate<? super T> p1, Predicate<? super T> p2) { return x -> p1.test(x) && p2.test(x); } static <T> Predicate<T> not(Predicate<T> p) { return x -> !p.test(x); }}这在JDK 8u11的javac上有效,在JDK 8u20上失败,然后在JDK 8u40-b02和JDK9-b27上又有效。



