2013-08-18 4 views
2

Java에서 람다 식을 배운 후 간단한 예제를 연습 해 보았습니다. 하지만 첫 번째 예제에서는 다음과 같은 오류가 발생합니다.Java의 IncompatibleClassChangeError

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 1Screenshot 2

+0

[JDK 8 with Lambda Support] (http://jdk8.java.net/lambda/)를 다운로드해야합니다. 해당 JDK 만 다운로드했는지 확인하십시오. –

+0

@RohitJain 물론 JDK1.8.0을 다운로드했습니다. 그렇지 않으면 컴파일되지 않습니다. –

+0

이것은 나를 위해 잘 실행됩니다. JDK와 함께 제공되는 JVM을 사용하고 있습니까? 또한 빌드 번호는 무엇을 사용하고 있습니까? 이전 버전은 버그가 많았습니다 – Reimeus

답변

1

는 이것 때문에 가능성이 있습니까?

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

람다 자바 (8)에서 수행 된 방법

이전 버전과 호환되지 방법으로, 아주 최근 (07/2013) 변경되었습니다.

PRE 베타 103 람다를 말하는 컴파일러로 어떻게 든 관리했지만 POST 103 람다의 JRE로 실행하는 경우 문제가 발생합니다.

(여기에 나와있는 힌트는 metafactory 이름이 대소 문자를 혼합하는 데 사용되지만 Java 1.8.0 베타 103에서는 소문자 인 것처럼 보입니다. 대/소문자가 혼합 된 경우를 찾고 있지만 찾을 수는 없습니다.)