gpt4 book ai didi

java - 为什么在尝试使用内部类的方法引用调用父类(super class)的 protected 方法时会出现 BootstrapMethodError?

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:04 24 4
gpt4 key购买 nike

在 Java 8 中,在包 a 中有一个父类(super class) Super 和在包 b 中有一个子类 Sub >,他有一个内部类 SubInner:

// Super.java
package a;

public abstract class Super {
private long value;
protected final void setValue(long value) {
this.value = value;
}
}

//Sub.java
package b;

public class Sub extends Super {
public void foo() {
new SubInner().foo();
}
private class SubInner {
void foo() {
Optional.of(1L).ifPresent(Sub.this::setValue); // Will throw IllegalAccessError at runtime.
Optional.of(1L).ifPresent(t -> setValue(t)); // However, lambda works.
setValue(1L); // also works.
}
}
}

我的问题是,为什么在这种情况下方法引用无法工作,而普通方法调用可以访问父类(super class)方法 setValue

另外,如果我尝试执行 Sub.super::setValue,代码不会编译并且错误似乎与运行时错误一致:setValuea.Super 中具有 protected 访问权限。

Exception in thread "main" java.lang.BootstrapMethodError: java.lang.IllegalAccessError: tried to access method a.Super.setValue(J)V from class b.Sub$SubInner
at b.Sub$SubInner.foo(Sub.java:14)
at b.Sub.foo(Sub.java:10)
at b.Sub.main(Sub.java:22)
Caused by: java.lang.IllegalAccessError: tried to access method a.Super.setValue(J)V from class b.Sub$SubInner
at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000)
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1394)
at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1750)
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477)
... 3 more

最佳答案

非常像this bug , 这是固定的...

我本地没有 java-9 以确认它确实如错误所述在 java-9 中修复;但在 java-11 和 java-12 下工作得很好。 javac/java 处理 lambda/方法引用的方式出现异常已经不是第一次了;通常 lambda 是方法引用的变通方法,反之亦然。

关于java - 为什么在尝试使用内部类的方法引用调用父类(super class)的 protected 方法时会出现 BootstrapMethodError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55898670/

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