当前位置: 首页 > 面试题库 >

Java 1.8.20编译器错误

许俊贤
2023-03-14
问题内容

以下代码块在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)));

问题答案:

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



 类似资料:
  • 我最近在部署到我们的共享主机时遇到了问题。从 Visual Studio 通过 Web 部署进行部署时,99% 的时间我在登录后在登录页面或主页上收到此错误。有时我可能会点击几下不同的部分,然后它就会击中。它通常会在几分钟到90分钟后消失。 运行Windows Server 2012 R2 Standard、IIS8和.NET 4.5的Web主机。 Web主机建议我需要使用Visual Studi

  • 请帮帮我!我找不到此问题的任何解决方案 “/”应用程序中的服务器错误。< br >编译错误< br >描述:编译服务此请求所需的资源时出错。请查看以下特定错误详细信息,并适当修改您的源代码。 编译器错误消息: 编译器失败,错误代码为-2146232576。 显示详细的编译器输出: C:\Windows\System32\inetsrv 版本信息: 微软 .NET 框架版本:4.0.30319;AS

  • 问题内容: 由于某些原因,CMake的C和C++编译器默认设置为。 cmake -D CMAKE_C_COMPILER = / usr / bin / gcc -D CMAKE_CXX_COMPILER = / usr / bin / g ++ 但我得到了错误 CMake错误:源目录[当前目录] / CMAKE_CXX_COMPILER = / usr / bin / g ++“不存在。 为什么C

  • 所以我看到它找不到promise和地图。