Pourquoi ce code ne se compile-t-il pas?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Pourquoi je ne peux pas passer une variable de classe à instanceof
?
java
class
instanceof
eric2323223
la source
la source
Integer
n'est pas un littéral de classe.Integer.class
serait un littéral de classe (voir § 15.8.2 du JLS: java.sun.com/docs/books/jls/third_edition/html/… ). L'instanceof
opérateur prend un "ReferenceType" (aka un nom de type) comme spécifié au § 15.20.2 du JLS: java.sun.com/docs/books/jls/third_edition/html/…clazz.isInstance(obj)
puisque l'objet est déjà fourni.instanceof
ne peut être utilisé qu'avec des noms de classe explicites (indiqués au moment de la compilation). Afin de faire une vérification d' exécution , vous devez faire:Cela présente un petit avantage
clazz.isAssignableFrom(..)
car il traiteobj == null
mieux le cas .la source
Comme d'autres l'ont mentionné, vous ne pouvez pas passer une variable de classe à
instanceof
car une variable de classe fait référence à une instance d'un objet , alors que la main droite deinstanceof
doit être un type . Autrement dit,instanceof
cela ne signifie pas "y est une instance de l'objet x", cela signifie "y est une instance de type X". Si vous ne connaissez pas la différence entre un objet et un type, considérez:Object o = new Object();
Ici, le type est
Object
eto
est une référence à l'instance de l'Object avec ce type. Donc:if(o instanceof Object)
est valide mais
if(o instanceof o)
n'est pas parce que
o
sur le côté droit se trouve un objet, pas un type.Plus spécifique à votre cas, une instance de classe n'est pas un type, c'est un objet (qui est créé pour vous par la JVM). Dans votre méthode,
Class
est un type, maisclazz
est un objet (enfin, une référence à un objet)Vous avez besoin d'un moyen de comparer un objet à un objet de classe. Il se trouve que c'est populaire si ce vous est fourni en tant que méthode de la classe Object:
isInstance()
.Voici le Java Doc pour isInstance, qui explique mieux cela:
la source
Tout d'abord,
instanceof
exige que l'opérande de droite soit une classe réelle (par exempleobj instanceof Object
ouobj instanceof Integer
) et non une variable de typeClass
. Deuxièmement, vous avez fait une erreur de débutant assez courante que vous ne devriez vraiment pas faire ... le modèle suivant:Ce qui précède peut être refactorisé en:
Vous devez toujours effectuer cette refactorisation, car elle élimine une instruction if ... else redondante. De même, l'expression est refactorable au même résultat.
return conditional_expression ? true : false;
la source