&引用;java.lang.NoSuchFieldError:super“;编译器中的异常错误?

&引用;java.lang.NoSuchFieldError:super“;编译器中的异常错误?,java,javac,java-9,nosuchfieldexception,Java,Javac,Java 9,Nosuchfieldexception,正在运行的以下用Java-9编写的代码在运行时给了我一个非常奇怪和有趣的异常: Exception in thread "main" java.lang.NoSuchFieldError: super at A$C.test(A.java:15) at A.main(A.java:5) 守则: public class A { public static void main(String[] args) { new C().test(); }

正在运行的以下用Java-9编写的代码在运行时给了我一个非常奇怪和有趣的异常:

Exception in thread "main" java.lang.NoSuchFieldError: super
    at A$C.test(A.java:15)
    at A.main(A.java:5)
守则:

public class A {
    public static void main(String[] args) {
        new C().test();
    }

    interface B {
        private void test() {
        }
    }

    static class C implements B {
        void test() {
            B.super.test();
        }
    }
}
我想知道:它是这样设计的,还是理想情况下不应该编译此代码,因此这是一个编译器错误?(我个人认为这是一个bug

UPD:提交了一个bug,ID:9052188


UPD-2:它看起来像是
B.super.test()
通常是一个有效的构造,因为如果
test()
方法是
default
,那么它就可以正常工作。这一事实只会让事情变得更复杂。

最终,Java开发人员支持团队承认这个问题是一个bug,这里有一个链接:

猜测:a)这段代码无效(B超级接口是一个接口,因此没有必要遵从其中方法的实现)和B)是的,编译器bug。因此,合理的做法是:编写一个bug跟踪问题;-)当然,这是一个编译器错误。编译时没有错误且事后未被操作的程序在运行时不应得到
NoSuchFieldError
(除非显式创建并抛出它本身),无论源代码是否有效。@GhostCat:不完全正确
B
有一个
private
方法,该方法是可访问的,因为它是一个嵌套类,并且我们在同一个顶级类中。但是我认为,
B.super.test()
不是它的正确语法(但它是调用
default
方法的正确语法)。相比之下,
((B)this).test()
绝对是有效的语法,也能正确工作。@Andremoniy好吧,是的,不深入讨论,我们可以假设这可能是一个JVM错误,但我深入了
super
access从不使用名为
super
的字段实现,而且,当通过
((B)this.)调用该方法时,test()
,它工作平稳。剩下的唯一问题是
B.super.test()
是否有效,是否应该像
((B)this.test()
那样编译,或者它是否无效,是否应该被编译器拒绝。我倾向于后者。我认为
Interface.super.method()
是调用
default
方法的正确方法,但就我在JLS中所看到的,它仅用于调用
default
方法。关于可访问性,JVM从不允许其他(普通)类访问
private
方法。这就是编译器为嵌套类生成这些合成的
access$n
方法的原因。
NoSuchFieldError
不是JVM拒绝方法访问的指示器。