考虑以下示例(使用自定义JVM语言):
interface A { void foo() = println "A0" }
interface B extends A { override void foo() = println "A" }
interface C { void foo() = println "B" }
class D implements B, C
{
override void foo() = super[A].foo // A.super.foo
}
这会被java编译器拒绝,因为A
不是D
的直接超类型。由于我的编程语言目前没有捕获到这个错误,我设法得到了一个JVM验证错误:
java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
Location:
dyvil/test/Main$C.foo()V @1: invokespecial
Reason:
Error exists in the bytecode
Bytecode:
0000000: 2ab7 0015 b1
为什么这是JVM的问题?我总是invokespecial
说'调用这个实例方法,但不做动态调度'?该问题是否与类文件中的SUPER
访问标志有关?最后,是否有解决方法?