对checkcast字节码指令的困惑?

我正在研究自己的JVM实现,然后转向
checkcast
指令。完整文档在此页面上。我很好奇,因为在枚举演员如何工作的规则时,检查的一个条件是被检查的对象引用是否是接口类型。据我了解,这是不可能的;接口不能直接实例化,实现接口的任何对象都有其他一些具体的类类型。我错过了什么吗?     
已邀请:
看来你并不是唯一一个对这个定义感到困惑的人,这篇博文有一个解释: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维护者验证这一点,但据我所知,这是接口类型规则存在的唯一原因。     
  如果S是接口类型,则:      如果T是类类型,则T必须是Object(第2.4.7节)。   如果T是接口类型,则T必须是与S相同的接口或S的超接口(§2.13.2)。 这对我来说似乎很清楚:接口可以转换为它扩展的接口。这种情况用于例如在DataInputStream上调用序列化时:接口DataInputStream实现Serializable,因此我们将对象转换为Serializable,甚至不知道对象的实现类是什么。     

要回复问题请先登录注册