java编译器是否使用instanceof检查两个引用是否属于同一类型?
我想知道java编译器是如何工作的。它是否使用instanceof检查两个引用在编译时是否属于同一类型? e、 g:Super superRef=new Sub(); Sub subRef=(Sub)superRef; 据说在编译时compile会检查赋值两边的两种类型是否匹配。我想知道它是如何在编译器中实现的
你可以在下面搜索框中键入要查询的问题!
我想知道java编译器是如何工作的。它是否使用instanceof检查两个引用在编译时是否属于同一类型? e、 g:Super superRef=new Sub(); Sub subRef=(Sub)superRef; 据说在编译时compile会检查赋值两边的两种类型是否匹配。我想知道它是如何在编译器中实现的
# 1 楼答案
instanceof
是一种运行时检查。编译器在编译时不使用它同样,类型cast
(Sub) superRef
也将在运行时发生,编译器不会检查它(除了排除不可能的情况,例如将String
转换为Integer
)编译器会考虑编译类型信息。最重要的是
Super
和Sub
的类文件定义。在那里,您将有extends
和implements
语句。根据这些,类型层次结构被构建。此信息用于检查类型是否兼容(以及是否存在方法和字段)。如果您正在寻找一个实现这一点的公共API,那么它应该最类似于Super.class.isAssignableFrom(Sub.class)
像
instanceof
和运行时类型转换这样的事情之所以存在,是因为并不是所有事情都可以提前确定