尝试使用内部类的方法引用调用超类的受保护方法时

在 Java 8 中,给定 package 中的超类Super和 package 中a的子类Sub,b它们有一个内部类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.

    }

  }

}

我的问题是,为什么方法引用在这种情况下不起作用,而普通方法调用可以访问超类方法setValue?


另外,如果我尝试这样做Sub.super::setValue,代码将无法编译,并且错误似乎与运行时错误一致:setValuehas protected access in a.Super.


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


慕码人8056858
浏览 95回答 1
1回答

皈依舞

它看起来很像这个错误,已修复......我在本地没有 java-9 来确认它确实在 java-9 中修复为错误状态;但在 java-11 和 java-12 下工作得很好。这不是第一次在处理 lambda/方法引用方面出现异常javac/java;通常 lambda 是方法引用的解决方法,反之亦然。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java