23
class A {

    public static void main(String...args) {
        Integer var = 10; 

        if(var instanceof Character)  // Line1
            System.out.println("var is a Character");
    }
}

我知道第 1 行不会编译,因为编译器发现它var不是Character.

我不明白的是为什么编译器会抛出错误而不是返回falseor true

如果编译器返回falsetrue(即像常规的基于 if 的验证一样对待instanceof操作),那么它会更有用.. 不是吗?

还是我错过了一些明显的东西?

4

2 回答 2

20

这是根据JLS §15.20.2的编译错误:

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

RelationalExpression是第一个操作数,instanceofReferenceType第二个。

于 2013-08-31T13:04:42.603 回答
3

除了 arshajii 的答案之外,如果您想避免编译时错误并希望运行时 true/false 结果来检查 var 是否是 Character 的实例,请使用如下代码:

if(var.getClass().isAssignableFrom(Character.class))
    System.out.println("var is a Character");
else
    System.out.println("var is NOT a Character");

如您所料,它将打印:

var is NOT a Character
于 2013-08-31T13:12:08.043 回答