Почему это не кодирует компиляцию?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Почему я не могу передать переменную класса instanceof
?
Оператор instanceof
работает с ссылочными типами, такими как Integer
], а не на объектах, как new Integer (213)
. Вы, вероятно, захотите что-то вроде
clazz.isInstance(obj)
Примечание: ваш код будет более кратким, если вы напишете
public boolean isOf(Class clazz, Object obj){
return clazz.isInstance(obj)
}
Однако не совсем уверен, нужен ли вам метод больше.
Во-первых, 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;
рефакторизуется до того же результата.
instanceof
можно использовать только с явными именами классов (заданными во время компиляции). Для проверки во время выполнения следует сделать:
clazz.isInstance(obj)
Это имеет небольшое преимущество перед clazz.isAssignableFrom(...)
, поскольку лучше справляется со случаем obj == null
.