我在运行以下代码时遇到问题:
public class LambdaTesting {
public static void main(String[] args){
new LambdaTesting();
}
public LambdaTesting(){
test1();
}
private void test1(){
Runnable x = () -> System.out.println("ok"); //error
}
}这将导致以下异常:
*Exception in thread "main" java.lang.IncompatibleClassChangeError
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:383)
at LambdaTesting.test1(LambdaTesting.java:24)
at LambdaTesting.<init>(LambdaTesting.java:20)
at LambdaTesting.main(LambdaTesting.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:765)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:882)
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:381)
... 3 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:854)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:879)
... 6 more*我已经安装了从: jdk8下载的http://jdk8.java.net/lambda/ (Windows x64版本)
我在Eclipse上运行: 4.4.0下载自:http://downloads.efxclipse.org/eclipse-java8/2013-06-30/ (文件: org.eclipse.sdk.ide-win32.win32.x86_64.zip 30-2013年6月17:35 180M)
eclipse.ini文件:
-vm
C:\Program Files\Java\jre8\bin\java.exe
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130521-0416
-showsplash
org.eclipse.platform
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Xms40m
-Xmx512m项目属性-> Java ->编译器遵从级别: 1.8 (BETA) (选中默认遵从设置)。
项目属性-> Java构建路径->库: jre8
项目运行配置:
检查JRE选项卡项目JRE (jre8)
类路径选项卡引导条目: JRE系统库jre8
我还试图从jre8 8/bin目录中的命令行运行LambdaTesting.class,但也出现了同样的异常。
Java版本:
C:\Program Files\Java\jre8\bin>java.exe -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b102)我的操作系统是: Windows 7 x64
有什么线索吗?
多亏了@assylias,我解决了使用从命令行编译的问题,但在Eclipse中仍然没有结果。看来Eclipse的编译器错了。我尝试在: Preferences -> Java ->编译器中更改设置,但我只能在“生成的.class文件兼容性”中选择1.7个版本(此设置中没有1.8可用)。导致上述异常的“使用默认遵从设置”。
发布于 2013-11-14 18:03:44
我发现您的示例为最新的beta版编译得很好。不确定您要评估什么,但我做了一个类似的测试,如下所示:
public class LambdaTesting {
public static String[] strs = { "a", "aa", "aaa"};
public static void main(String args[]) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(3);
Set<Future<Integer>> set = new HashSet<Future<Integer>>();
for (String word : strs) {
Callable<Integer> c = (() -> word.length());
Future<Integer> future = pool.submit(c);
set.add(future);
}
int sum = 0;
for (Future<Integer> future : set) {
sum += future.get();
}
System.out.printf("The sum of lengths is %s%n", sum);
System.exit(sum);
}
}我使用了我在这里找到的一个示例执行器:java Runnable run() method returning a value作为我的基本程序,并用lambda表达式替换了wordcount。所有这些都与最新的Java 8测试版和2013年9月构建的eclipse开普勒很好,如下所示:http://downloads.efxclipse.org/eclipse-java8/ - Trip
https://stackoverflow.com/questions/18197437
复制相似问题