对checkcast字节码指令的困惑?

tem*_*def 12 java jvm casting bytecode interface

我正在研究自己的JVM实现,并开始接受checkcast指令.完整文档在此页面上.我很好奇,因为在枚举演员如何工作的规则时,检查的一个条件是被检查的对象引用是否是接口类型.据我了解,这是不可能的; 接口不能直接实例化,实现接口的任何对象都有其他一些具体的类类型.我错过了什么吗?

Jör*_*ann 22

看来你并不是唯一一个对这个定义感到困惑的人,这篇博文有一个解释:http://mbravenboer.blogspot.com/2008/12/why-jvm-spec-defines-checkcast-for.html

事实证明,这确实是一个"不可能"的案例.这个项目在规范中的原因是因为为数组递归定义了checkcast:

  • 如果S是表示数组类型SC []的类,即SC类型的组件数组,则:
  • ...
  • 如果T是数组类型TC [],即TC类型的组件数组,则必须满足以下条件之一:
    • ...
    • TC和SC是引用类型,并且可以通过递归应用这些规则将类型SC转换为TC.

因此,如果您有一个类型为List []的对象被强制转换为Collection [],那么对于类型S = List和T = Collection,将以递归方式调用checkcast规则.请注意,List是一个接口,但对象在运行时可以具有类型List [].如果还没有使用JVM Spec维护者验证这一点,但据我所知,这是接口类型规则存在的唯一原因.