对checkcast字节码指令的困惑?

时间:2011-02-10 22:11:13

标签: java interface casting jvm bytecode

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

2 个答案:

答案 0 :(得分: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维护者验证这一点,但据我所知,这是接口类型规则存在的唯一原因。

答案 1 :(得分:-2)

  

如果S是接口类型,则:

     

如果T是类类型,则T必须是Object(第2.4.7节)   如果T是接口类型,那么T必须是与S相同的接口或S的超接口(§2.13.2)。

我觉得很清楚:接口可以转换为扩展的接口。例如,在DataInputStream上调用序列化时会使用这种情况:接口DataInputStream实现Serializable,因此我们将对象转换为Serializable,甚至不知道对象的实现类是什么。