我有这两个界面。一个是公共(public)(A),另一个是包私有(private)(AA)。 A
扩展了AA
。
package pkg.a;
@FunctionalInterface
public interface A extends AA {
}
。
package pkg.a;
interface AA {
default void defaultM() {
System.out.println(m());
}
String m();
}
我有此代码(在其他程序包中):
package pkg;
import java.util.Arrays;
import java.util.List;
import pkg.a.A;
public class Test {
public static void main(String[] args) {
List<A> list = Arrays.asList(() -> "imp1", () -> "imp2");
list.stream().forEach(a -> a.defaultM());
list.stream().forEach(A::defaultM);
}
}
运行上面的代码时,
list.stream().forEach(A::defaultM);
引发以下异常。为什么?为什么lambda表达式可以,但是方法引用为什么不能访问package-private接口(interface)中定义的方法?我正在Java版本1.8.0_191的Eclipse(版本:2018-12(4.10.0))中运行它。imp1
imp2
Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
at pkg.Test.main(Test.java:14)
Caused by: java.lang.IllegalArgumentException: java.lang.IllegalAccessException: class is not public: pkg.a.AA.defaultM()void/invokeInterface, from pkg.Test
at java.lang.invoke.MethodHandles$Lookup.revealDirect(MethodHandles.java:1360)
at java.lang.invoke.AbstractValidatingLambdaMetafactory.<init>(AbstractValidatingLambdaMetafactory.java:131)
at java.lang.invoke.InnerClassLambdaMetafactory.<init>(InnerClassLambdaMetafactory.java:155)
at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:299)
at java.lang.invoke.CallSite.makeSite(CallSite.java:302)
... 3 more
Caused by: java.lang.IllegalAccessException: class is not public: pkg.a.AA.defaultM()void/invokeInterface, from pkg.Test
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:850)
at java.lang.invoke.MethodHandles$Lookup.checkAccess(MethodHandles.java:1536)
at java.lang.invoke.MethodHandles$Lookup.revealDirect(MethodHandles.java:1357)
... 7 more
最佳答案
这是一个错误:
Method reference uses wrong qualifying type。
在Java 9中已修复。
关于java - 为什么此方法引用在运行时失败,但没有进行相应的lambda调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57755303/