checkcast 字节码指令的混淆?

12
我正在开发自己的JVM实现,遇到了checkcast指令。完整的文档在这个页面上。我很好奇,在枚举强制类型转换规则时,检查的一个条件是被检查的对象引用是否为接口类型。据我的理解,这应该是不可能的;接口不能直接实例化,任何实现接口的对象都有其他具体类类型。我错过了什么吗?
2个回答

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[],那么checkcast规则会递归地应用于类型S=List和T=Collection。请注意,List是一个接口,但是一个对象在运行时可以具有类型List[]。我没有与JVM规范维护者验证过这一点,但据我所知,这是接口类型规则存在的唯一原因。

非常感谢!这正是我在寻找的答案类型。 - templatetypedef

-2
如果S是一个接口类型,则: 如果T是一个类类型,则T必须是Object(§2.4.7)。 如果T是一个接口类型,则T必须是与S相同的接口或S的超级接口(§2.13.2)。
对我来说,这似乎很清楚:一个接口可以被转换为它所扩展的接口。例如,在调用DataInputStream上的序列化时使用了这种情况:接口DataInputStream实现了Serializable,因此我们将对象强制转换为Serializable,甚至不知道对象的实现类是什么。

1
我认为你没有理解这个问题。另外,java.io.DataInputStream 是一个类,而不是接口。 - jcsahnwaldt Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接