小编典典

Java 1.8.20编译器错误

java

以下代码块在1.8.11中可以正常编译,但在1.8.20中会引发错误

private static String calculateSyntheticOrderTypePrice(
        FluentIterable<? extends CalculatorProvider> pendingProviders )
{
    FluentIterable <? extends CalculatorProvider> mlsLegProvidersAll = pendingProviders.filter(Predicates.and(
            IS_MLS_PROVIDER, Predicates.not(IS_SYNTHETIC)));
    FluentIterable <? extends CalculatorProvider> mlsLegProvidersNewest = reduceToNewestMlsPrices(mlsLegProvidersAll);

    FluentIterable <? extends CalculatorProvider> otherLegProviderAll = pendingProviders.filter(Predicates.and(
            Predicates.not(IS_MLS_PROVIDER), Predicates.not(IS_SYNTHETIC)));

    FluentIterable <String> mlsHeadPriceTypes = mlsLegProvidersNewest.transform(TO_MLS_SPREAD_PRICE_FUN); /* MLS head: spread price */
    FluentIterable <String> orderPriceTypes = otherLegProviderAll.transform(TO_ORDER_TYPE_PRICE_FUN);         /* non-MLS orders: option spread or pairs */

    FluentIterable <String> formattedOrderHeadPriceTypes = orderPriceTypes.transform(new FormatOrderTypePriceFun(creditOrDebit(otherLegProviderAll)));
    FluentIterable <String> allFormatted =  FluentIterable.from(Iterables.concat(mlsHeadPriceTypes, formattedOrderHeadPriceTypes));

    return CalculatorValues.rollupStrings(allFormatted);
}

我得到的错误是java:找不到适合过滤器的方法(com.google.common.base.Predicate)

在更新8和20之间是否存在会影响此代码的更改?我在两种情况下都使用相同版本的guava 17.0(最新版本),唯一的变化是Java中的更新版本。

任何帮助是极大的赞赏。

编辑

显示错误的行是

FluentIterable <? extends CalculatorProvider> mlsLegProvidersAll = pendingProviders.filter(Predicates.and(
            IS_MLS_PROVIDER, Predicates.not(IS_SYNTHETIC)));

阅读 230

收藏
2020-11-30

共1个答案

小编典典

这很可能是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上又有效。

2020-11-30