【问题标题】:instanceof operator in case of primitive and wrapper type arrayinstanceof 运算符在原始和包装类型数组的情况下
【发布时间】:2014-10-10 05:24:25
【问题描述】:
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 行将成功编译并给出结果为真,但在第 2 行的情况下,为什么会导致编译错误? 从第 1 行和第 3 行可以清楚地看出,这两个数组是 instanceof 对象,但在 Object[] 的情况下,为什么 结果不一样?

【问题讨论】:

    标签: java arrays object instanceof scjp


    【解决方案1】:

    JLS 15.20.2. 说:

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

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

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

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

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

    【讨论】:

    • 谢谢..但如果 primitivI 是 instanceof Object 那么为什么它不是 Object[] 的实例.. wrapperI 也是如此
    • @Nirav primitivel 是一个数组,因此可以转换为一个对象,因为数组是一个对象。不能转换为Object[],因为它是原始类型的数组,所以不能转换为Object的数组。
    • 知道了...如果我取 int a = 10 然后用 instanceof 检查它也会给我编译错误。在这里,我正在检查数组到 instanceof 对象,这就是为什么它给了我结果 true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多