Почему переменная “Класса” не может быть передана instanceof?

Почему это не кодирует компиляцию?

    public boolean isOf(Class clazz, Object obj){
        if(obj instanceof clazz){
            return true;
        }else{
            return false;
        }
    }

Почему я не могу передать переменную класса instanceof?

81
задан Mark Rotteveel 17 December 2016 в 11:16
поделиться

3 ответа

Оператор instanceof работает с ссылочными типами, такими как Integer ], а не на объектах, как new Integer (213) . Вы, вероятно, захотите что-то вроде

clazz.isInstance(obj)

Примечание: ваш код будет более кратким, если вы напишете

public boolean isOf(Class clazz, Object obj){
    return clazz.isInstance(obj)
}

Однако не совсем уверен, нужен ли вам метод больше.

124
ответ дан 24 November 2019 в 09:38
поделиться

Во-первых, instanceof требует, чтобы операнд справа был реальным классом (например, instanceof). например, obj instanceof Object или obj instanceof Integer), а не переменная типа Class. Во-вторых, вы совершили довольно распространенную ошибку новичков, которую на самом деле не следует делать... следующий шаблон:

if ( conditional_expression ){
    return true;
} else{
    return false;
}

Вышеприведенное выражение можно рефакторить в:

return conditional_expression;

Вы всегда должны выполнять этот рефакторинг, поскольку он устраняет избыточное выражение if...else. Аналогично, выражение return условное_выражение ? true : false; рефакторизуется до того же результата.

3
ответ дан 24 November 2019 в 09:38
поделиться

instanceof можно использовать только с явными именами классов (заданными во время компиляции). Для проверки во время выполнения следует сделать:

clazz.isInstance(obj)

Это имеет небольшое преимущество перед clazz.isAssignableFrom(...), поскольку лучше справляется со случаем obj == null.

12
ответ дан 24 November 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: