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

时间:2014-10-10 05:24:25

标签: java arrays object instanceof scjp

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

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

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

1 个答案:

答案 0 :(得分:1)

JLS 15.20.2.说:

  

如果将RelationalExpression转换为ReferenceType将作为编译时错误被拒绝,则关系表达式的实例同样会产生编译时错误。在这种情况下,instanceof表达式的结果永远不会成立。

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

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

String s = "dgd";
System.out.println(s instanceof Integer);

同样,您的第二个示例无法编译,因为int[]无法转换为Object[]。您的所有其他示例都会进行编译,因为primitivI可以转换为ObjectwrapperI可以转换为ObjectObject[]