Java 编译器是否使用instanceof检查两个引用是否属于同一类型?

Java 编译器是否使用instanceof检查两个引用是否属于同一类型?,java,compiler-construction,Java,Compiler Construction,我有点想知道java编译器是如何工作的。它是否使用instanceof检查两个引用在编译时是否属于同一类型? e、 g:Super-superRef=新的Sub(); Sub subRef=(Sub)superRef; 据说在编译时compile将检查赋值两边的两种类型是否匹配。我想知道它是如何在编译器中实现的。instanceof是一个运行时检查。编译器在编译时不使用它 同样,类型cast(Sub)superRef也将在运行时发生,并且不会被编译器检查(除了排除不可能的情况,例如将String

我有点想知道java编译器是如何工作的。它是否使用instanceof检查两个引用在编译时是否属于同一类型? e、 g:Super-superRef=新的Sub(); Sub subRef=(Sub)superRef;
据说在编译时compile将检查赋值两边的两种类型是否匹配。我想知道它是如何在编译器中实现的。

instanceof
是一个运行时检查。编译器在编译时不使用它

同样,类型cast
(Sub)superRef
也将在运行时发生,并且不会被编译器检查(除了排除不可能的情况,例如将
String
转换为
Integer

编译器会考虑编译类型信息。最重要的是,
Super
Sub
的类文件定义。在那里,您将有
扩展
实现
语句。根据这些,将构建类型层次结构。此信息用于检查类型是否兼容(以及是否存在方法和字段)。如果您正在寻找一个实现这一点的公共API,那么它应该最类似于
Super.class.isAssignableFrom(Sub.class)


instanceof
和运行时类型转换这样的事情之所以存在,是因为并不是所有事情都可以提前确定。

instanceof
是运行时检查。编译器在编译时不使用它

同样,类型cast
(Sub)superRef
也将在运行时发生,并且不会被编译器检查(除了排除不可能的情况,例如将
String
转换为
Integer

编译器会考虑编译类型信息。最重要的是,
Super
Sub
的类文件定义。在那里,您将有
扩展
实现
语句。根据这些,将构建类型层次结构。此信息用于检查类型是否兼容(以及是否存在方法和字段)。如果您正在寻找一个实现这一点的公共API,那么它应该最类似于
Super.class.isAssignableFrom(Sub.class)


instanceof
和运行时类型转换这样的事情之所以存在,是因为并不是所有事情都可以提前确定。

可能类似于
typeOfLeftThing.isAssignableFrom(typeofrighthing)
。。。这将是作为编译器的一部分(不是Java的一部分)编写的方法。编译器没有对象来执行
instanceof
。它甚至没有
instanceof
所期望的类对象作为右参数。它具有被编译程序引用的类的内部表示形式。诸如@immibis positions之类的函数用于查询这些内部表示形式。该方法实际上存在于公共API中:@HotLicks它几乎肯定会有一些表示变量类型的对象。它不会是java.lang.Class实例。@Thilo-实际上,它可以引用不同的JDK类,而不是它所运行的JDK类。可能类似于
typeOfLeftThing.isAssignableFrom(typeOfRightThing)
。。。这将是作为编译器的一部分(不是Java的一部分)编写的方法。编译器没有对象来执行
instanceof
。它甚至没有
instanceof
所期望的类对象作为右参数。它具有被编译程序引用的类的内部表示形式。诸如@immibis positions之类的函数用于查询这些内部表示形式。该方法实际上存在于公共API中:@HotLicks它几乎肯定会有一些表示变量类型的对象。它不会是java.lang.Class实例。@Thilo-实际上,它可以引用不同于它所运行的JDK类。