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