在原语和包装类型数组的情况下的instanceof运算符

Nir*_*ati 7 java arrays scjp object instanceof

int primitivI[] = {1,1,1};
Integer wrapperI[] = {2,22,2};


1. System.out.println(primitivI instanceof Object);//true
2. System.out.println(primitivI instanceof Object[]);//Compilation Error Why ????
3. System.out.println(wrapperI  instanceof Object);//true
4. System.out.println(wrapperI  instanceof Object[]);//true
Run Code Online (Sandbox Code Playgroud)

这里我有两个整数(primitve,Wrapper)类型的数组,但我对instanceof运算符有不同的结果

看到第2行和第4行第4行将成功编译并给出结果为true但是在第2行的情况下,为什么会导致编译错误?从第1行和第3行可以清楚地看出,这两个数组是对象的实例,但如果是Object[],为什么结果会有所不同?

Era*_*ran 1

JLS 15.20.2。说:

如果 RelationalExpression 到 ReferenceType 的强制转换会因编译时错误而被拒绝,则关系表达式的 instanceof 同样会产生编译时错误。在这种情况下,instanceof 表达式的结果永远不可能为真。

这意味着如果在编译时编译器知道 X 不能是 Y 的实例,则表达式X instanceof Y将给出编译时错误。

您可以获得无法编译的更简单的示例,而无需尝试使用数组:

String s = "dgd";
System.out.println(s instanceof Integer);
Run Code Online (Sandbox Code Playgroud)

同样,您的第二个示例无法编译,因为int[]无法转换为Object[]. 所有其他示例都会编译,因为可以primitivI强制转换为Objectand 。wrapperIObjectObject[]