2016-08-05 2 views
-3
Function<StringBuilder,Integer> function = StringBuilder::length; 
System.out.println(function.apply(new StringBuilder("abcd"))); 

콘솔java8 함수 참조있는 IllegalAccessError

Exception in thread "main" java.lang.IllegalAccessError: tried to access class java.lang.AbstractStringBuilder from class stream.CollectCollector 
    at stream.CollectCollector.lambda$main$0(CollectCollector.java:25) 

문제 resoled! JDK 버그 https://bugs.openjdk.java.net/browse/JDK-8162779

+0

프로그래밍 오류처럼 보임 Function function = StringBuilder :: length why are are 당신은 자바에서 "::"C++ 연산자를 사용하고 있습니까? – Fairoz

+2

@Fairoz 이것은 Java 8 메소드 참조입니다. –

+0

XY 문제입니까? 오류를 재현 할 수 없습니다. – Flown

답변

1

AbstractStringBuilderlength 방법을 구현하는 클래스에 액세스하려고하지만이 지역의 가시성을 가지고 것 같습니다.

Function<StringBuilder,Integer> function = sb -> sb.length(); 
System.out.println(function.apply(new StringBuilder("abcd"))); 
1

의 StringBuilder가 AbstractStringBuilder 확장 :

당신은 반사하지만이에 코드를 변경하는 것입니다 해결하는 가장 쉬운 방법으로 변경할 수 있습니다. StringBuilder :: length와 함께 메서드 참조를 사용하는 경우 StringBuilder는 AbstractStringBuilder.length()를 참조합니다. AbstractStringBuilder에는 기본 액세스 한정자가 있기 때문에 기본 패키지 (java.lang)에서 액세스 할 수 없으므로 해당 오류가 throw됩니다.

+0

왜 java8 이러한 접근 방식을 지원하지 않습니다,이 문제는 런타임 오류로 이어질 것입니다, 그것은 문제가 발생할 수 있습니다. – printfabcd

+0

@printfabcd 실제로 java8 지원하는 방법 참조하지만,이 오류는 부모 클래스의 액세스 한정자 때문에 발생합니다 그 클래스는 현재 클래스에서 액세스 할 수 없습니다. StringBuilder 자체는 AbstractStringBuilder의 length 메소드를 대체하지 않습니다. 따라서 StringBuilder :: length를 사용하면 부모 클래스에 메서드가 검색됩니다. – HendraWD

+1

오류가 없습니다 ... 질문의 코드가 작동합니다. 'length()'는 public 메소드이며,'StringBuilder'에서 public으로 상속됩니다. – Tunaki