【问题标题】:Java 1.8.20 Compiler errorJava 1.8.20 编译器错误
【发布时间】:2014-08-20 21:38:33
【问题描述】:

以下代码块在 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:not suitable method found for filter (com.google.common.base.Predicate)

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

非常感谢任何帮助。

编辑

显示错误的行是

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

【问题讨论】:

  • 你能把你的代码缩短到重现错误所需的最小部分吗?
  • 现在请发布完整和准确的错误信息。
  • 如果有IS_SYNTHETICIS_MLS_PROVIDER的声明就好了。

标签: java guava java-8


【解决方案1】:

这很可能是JDK-8051402,它是在 JDK 8u11 之后引入的,在 JDK 8u20 中发现但来不及修复,并在 JDK 8u20 之后修复。修复出现在JDK 8u40 early access 快照版本 b02 和JDK 9 early access 快照版本 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 上再次有效。

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多