Почему этот код не компилируется?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Почему я не могу передать переменную класса instanceof
?
java
class
instanceof
eric2323223
источник
источник
Integer
это не литерал класса.Integer.class
будет литералом класса (см. § 15.8.2 JLS: java.sun.com/docs/books/jls/third_edition/html/… ).instanceof
Оператор принимает «ReferenceType» (он же имя типа) , как указано § 15.20.2 из JLS: java.sun.com/docs/books/jls/third_edition/html/...clazz.isInstance(obj)
поскольку объект уже поставлен.instanceof
может использоваться только с явными именами классов (указанными во время компиляции). Чтобы выполнить проверку во время выполнения , вы должны сделать:У этого есть небольшое преимущество,
clazz.isAssignableFrom(..)
так как онobj == null
лучше подходит для случая .источник
Как уже упоминалось, вы не можете передать переменную класса,
instanceof
потому что переменная класса ссылается на экземпляр объекта , а правая сторонаinstanceof
должна быть типом . То естьinstanceof
не означает «y является экземпляром объекта x», это означает «y является экземпляром типа X». Если вы не знаете разницы между объектом и типом, подумайте:Object o = new Object();
Здесь, тип
Object
иo
является ссылкой на экземпляр объекта с этим типом. Таким образом:if(o instanceof Object)
действительно, но
if(o instanceof o)
не потому,
o
что справа находится объект, а не тип.Более конкретно для вашего случая, экземпляр класса - это не тип, это объект (который создается для вас JVM). В вашем методе
Class
это тип, ноclazz
это объект (ну, ссылка на объект)Что вам нужно, так это способ сравнить объект с объектом класса. Оказывается, что это популярное , так это предоставляется вам в качестве метода объекта класса:
isInstance()
.Вот документ Java для isInstance, который лучше объясняет это:
источник
Во-первых,
instanceof
требуется, чтобы операнд справа был фактическим классом (например,obj instanceof Object
илиobj instanceof Integer
), а не переменной типаClass
. Во-вторых, вы сделали довольно частую ошибку новичков, которую действительно не следует делать ... следующий шаблон:Вышесказанное можно преобразовать в:
Вы должны всегда выполнять этот рефакторинг, поскольку он устраняет избыточный оператор if ... else. Точно так же выражение можно отредактировать для получения того же результата.
return conditional_expression ? true : false;
источник