java - Java 中的 IncompatibleClassChangeError

标签 java lambda java-8

在学习了 Java 中的 Lambda 表达式之后,我尝试练习一些简单的示例。但仅在我的第一个示例中,我收到了以下错误。

Exception in thread "main" java.lang.IncompatibleClassChangeError
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:384)
at com.example.lambda.HelloLambda.main(HelloLambda.java:15)
Caused by: java.lang.NoSuchMethodException: no such method: java.lang.invoke.LambdaMetafactory.metaFactory(Lookup,String,MethodType,MethodHandle,MethodHandle,MethodType)CallSite/invokeStatic
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:763)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:880)
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1019)
at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1284)
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:382)
... 1 more
Caused by: java.lang.NoSuchMethodError: java.lang.invoke.LambdaMetafactory.metaFactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:852)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:877)
... 4 more

由于向后兼容性问题,该错误似乎是一个错误。但不知道如何解决这个问题。 StackOverFlow 中的许多答案建议重新编译可以解决此问题。但我仍然收到此错误。

我的代码

package com.example.lambda;

public class HelloLambda {

static String firstname = "ChanSek";
static String lastname = "Nayak";

interface HelloService {
      String hello();
}

public static void main(String[] args) {

        HelloService helloService = 
            () -> {String hello="Hello " + firstname + " " + lastname; 
                           return hello;};
    System.out.println(helloService.hello());
    }
}

代码编译正常。但是运行出现上面提到的错误。

我使用的是 JDK1.8.0 快照。

ScreenShot 1 Screenshot 2

最佳答案

可能是因为这个?

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8019635

最近 (07/2013),Java 8 中 lambda 的执行方式发生了变化,以不向后兼容的方式发生了变化。

如果您设法使用支持 PRE beta 103 lambda 的编译器进行编译,但正在使用 POST 103 lambda 的 JRE 运行,那么您将遇到问题。

(这里给我的提示是,元工厂名称过去是大小写混合的,但在 Java 1.8.0 beta 103 中似乎是小写 - 您正在搜索混合大小写,但没有找到它。)

关于java - Java 中的 IncompatibleClassChangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301675/

相关文章:

java - SWTChart 鼠标悬停处理

Java 没有正确写入文件

java - 安卓:定时器问题

c++ - 我应该什么时候使用 std::bind?

java - 如何使用流在没有冗余代码的情况下获取嵌套集合的最小/最大元素?

Java 8 - 根据谓词递归删除文件夹

java - 我如何转换字符串以将其实现为数据库字段 - Java/Spring/Postgres?

c++ - 将 integral_constants 的元组转换为 int 的 constexpr 元组

c# - 如何将 C# 中的 Lambda 表达式转换为 C++

JavaFX:使用 sum 函数对 TableView 进行分组