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 de instanceof
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
et o
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, mais clazz
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:
public boolean isInstance(Object obj)
Détermine si l'objet spécifié est compatible avec l'affectation avec l'objet représenté par cette classe. Cette méthode est l'équivalent dynamique de l'opérateur instanceof du langage Java. La méthode retourne true si l'argument Object spécifié est non nul et peut être converti en type de référence représenté par cet objet Class sans déclencher d'exception ClassCastException. Sinon, elle renvoie false.
Plus précisément, si cet objet Class représente une classe déclarée, cette méthode retourne true si l'argument Object spécifié est une instance de la classe représentée (ou de l'une de ses sous-classes); il retourne false sinon. Si cet objet Class représente une classe tableau, cette méthode retourne true si l'argument Object spécifié peut être converti en objet de la classe tableau par une conversion d'identité ou par une conversion de référence élargie; il retourne false sinon. Si cet objet Class représente une interface, cette méthode renvoie true si la classe ou toute superclasse de l'argument Object spécifié implémente cette interface; il retourne false sinon. Si cet objet Class représente un type primitif, cette méthode renvoie false.
Paramètres: obj - l'objet à vérifier
Renvoie: true si obj est une instance de cette classe
Depuis: JDK1.1