Instanceof в Java - почему это не компилируется?

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.

Я не понимаю, почему компилятор выдает ошибку вместо возврата false или true.

Если компилятор возвращает false или true (например, рассматривая операцию instanceof как регулярную проверку на основе if), тогда она будет намного полезнее... не так ли?

Или я пропущу что-то очевидное?

Ответы

Ответ 1

Это ошибка компиляции в соответствии с JLS §15.20.2:

Если преобразование RelationalExpression в ReferenceType будет отклонено как ошибка времени компиляции, то реляционное выражение instanceof также создает ошибку времени компиляции. В такой ситуации результат выражения instanceof никогда не может быть правдой.

RelationalExpression - первый операнд instanceof, а ReferenceType - второй.

Ответ 2

В дополнение к ответу 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