gpt4 book ai didi

java - 为什么此方法引用在运行时失败但相应的 lambda 调用却没有?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:57 25 4
gpt4 key购买 nike

我有这两个接口(interface)。一个是公共(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); 会抛出以下异常。为什么?为什么方法引用不能访问包私有(private)接口(interface)中定义的方法,而 lambda 表达式可以?我在 Eclipse(版本:2018-12 (4.10.0))中使用 Java 版本 1.8.0_191 运行它。

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 .

A reference to a method declared in a package-access class (via a public subtype) compiles to a lambda bridge; the qualifying type in the bridge method is the declaring class, not the referenced class. This leads to an IllegalAccessError.

已在 Java 9 中修复。

关于java - 为什么此方法引用在运行时失败但相应的 lambda 调用却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57755303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com