繁体   English   中英

Java汇编指令instanceof的规则是什么意思?

[英]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表达式生成的实例,这些实例具有实现功能接口的未指定(匿名)类型。

所以乍一看,这些规则的这一部分似乎毫无意义。 但请考虑全文:

以下规则用于确定非nullobjectref是否为已解析类型的实例:如果Sobjectref引用的对象的类,而T是已解析的类,数组或接口类型,则instanceof确定是否objectrefT一个实例,如下所示:

  • 如果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类型的组件数组,则必须满足以下条件之一:
      • TCSC是相同的原始类型。
      • TCSC是引用类型,类型SC可以通过这些运行时规则转换为TC

由于objectref引用的实际对象不可能具有接口类型,因此只应用其他两个项目符号; 它的类型是“普通(非阵列)类”或数组类型。 在后一种情况下,最后一句是有趣的,因为它引用了引用的规则作为一个整体,如果两者都是引用类型的数组,则应用于TS的组件类型。 并且组件类型可以是接口类型。

因此,您可以使用接口类型的实际数组实例测试这些规则,并检查其他数组类型:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM