[英]What is the meaning of the rules for Java assembly instruction instanceof?
在Java字节码汇编指令级别向下钻取到运算符instanceof
时,它对应于Java汇编指令instanceof
。 但我读过以前的规则
确定非null的objectref是否为已解析类型的实例:
第二条规则告诉:
如果S是接口类型,则:
- 如果T是类类型,那么T必须是Object。
- 如果T是接口类型,那么T必须是与S相同的接口或S的超接口。
这让我很困惑。 “S是接口类型”是指S的引用类型是接口类型吗? 如果是这样,第一条规则“如果T是一个类类型,则T必须是一个对象”不能成立。 例如,
CharSequence charSequence = new StringBuilder("test");
System.out.println(charSequence instanceof StringBuilder);
System.out.println(charSequence instanceof String);
上面代码中的第二行将打印为true,而上面的第三行将打印为false。 所以我怀疑我的理解可能是错的,任何人都可以帮助解释上述规则的含义?
你有权混淆,因为这些规则的编写方式令人困惑。
对于objectref , 不可能有接口类型,因为每个实例化对象都有一个实际的非抽象类型,可能实现了一个接口。 这甚至适用于为lambda表达式生成的实例,这些实例具有实现功能接口的未指定(匿名)类型。
所以乍一看,这些规则的这一部分似乎毫无意义。 但请考虑全文:
以下规则用于确定非
null
的objectref是否为已解析类型的实例:如果S
是objectref引用的对象的类,而T
是已解析的类,数组或接口类型,则instanceof确定是否objectref是T
一个实例,如下所示:
- 如果
S
是普通(非阵列)类,那么:
- 如果
T
是类类型,则S
必须与T
相同,或者S
必须是T的子类;- 如果
T
是接口类型,那么S
必须实现接口T
- 如果
S
是接口类型,则:
- 如果
T
是类类型,那么T
必须是Object。- 如果
T
是一个接口类型,那么T
必须是相同的接口S
或一个超接口S
。- 如果
S
是表示数组类型SC[]
,即SC
类型的组件数组,则:
- 如果
T
是类类型,那么T
必须是Object。- 如果
T
是接口类型,则T
必须是由数组实现的接口之一(JLS§4.10.3)。- 如果
T
是数组类型TC[]
,即TC
类型的组件数组,则必须满足以下条件之一:
TC
和SC
是相同的原始类型。TC
和SC
是引用类型,类型SC
可以通过这些运行时规则转换为TC
。
由于objectref引用的实际对象不可能具有接口类型,因此只应用其他两个项目符号; 它的类型是“普通(非阵列)类”或数组类型。 在后一种情况下,最后一句是有趣的,因为它引用了引用的规则作为一个整体,如果两者都是引用类型的数组,则应用于T
和S
的组件类型。 并且组件类型可以是接口类型。
因此,您可以使用接口类型的实际数组实例测试这些规则,并检查其他数组类型:
Object o = new Collection[0]; // SC is Collection
System.out.println(o instanceof Object[]); // TC is class type Object -> true
System.out.println(o instanceof String[]); // TC is class type other than Object -> false
System.out.println(o instanceof Collection[]); // TC == SC -> true
System.out.println(o instanceof Iterable[]); // TC is super interface of SC -> true
System.out.println(o instanceof List[]); // TC is not super interface SC -> false
它认为,如果在数组特殊情况下描述接口案例,它可能会更少混淆。 另一方面,这三种情况遵循一般的正式分配规则,因此在这种形式下更容易识别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.