Java中的instanceof - 为什么不编译?

时间:2013-08-31 13:01:19

标签: java instanceof

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

我无法理解的是编译器抛出错误而不是返回falsetrue的原因。

如果编译器返回falsetrue(即将instanceof操作视为常规的基于if的验证),那么它会更有用..它不会吗?< / p>

或者我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:18)

根据JLS §15.20.2

,这是一个编译错误
  

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

RelationalExpression instanceof的第一个操作数, ReferenceType 是第二个。

答案 1 :(得分:3)

除了arshajii的答案如果你想避免编译时错误并希望运行时的真/假结果来检查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