Come altri hanno già detto, non puoi passare una variabile di classe a instanceof
perché una variabile di classe fa riferimento a un'istanza di un oggetto , mentre la mano destra di instanceof
deve essere un tipo . Cioè, instanceof
non significa "y è un'istanza di Object x", significa "y è un'istanza di tipo X". Se non conosci la differenza tra un oggetto e un tipo, considera:
Object o = new Object();
In questo caso, il tipo è Object
ed o
è un riferimento all'istanza dell'oggetto Object con quel tipo. Quindi:
if(o instanceof Object)
è valido ma
if(o instanceof o)
non è perché o
sul lato destro c'è un oggetto, non un tipo.
Più specifico per il tuo caso, un'istanza di classe non è un tipo, è un oggetto (che viene creato per te dalla JVM). Nel tuo metodo, Class
è un tipo, ma clazz
è un oggetto (beh, un riferimento a un oggetto)
Ciò di cui hai bisogno è un modo per confrontare un oggetto con un oggetto classe. Si scopre che questo è popolare quindi questo è fornito come un metodo dell'oggetto Classe: isInstance()
.
Ecco il Java Doc per isInstance, che lo spiega meglio:
public boolean isInstance(Object obj)
Determina se l'oggetto specificato è compatibile con l'assegnazione con l'oggetto rappresentato da questa classe. Questo metodo è l'equivalente dinamico dell'operatore instanceof del linguaggio Java. Il metodo restituisce true se l'argomento Object specificato non è null e può essere eseguito il cast al tipo di riferimento rappresentato da questo oggetto Class senza generare un'eccezione ClassCastException. In caso contrario, restituisce false.
In particolare, se questo oggetto Class rappresenta una classe dichiarata, questo metodo restituisce true se l'argomento Object specificato è un'istanza della classe rappresentata (o di una delle sue sottoclassi); altrimenti restituisce false. Se questo oggetto Class rappresenta una classe array, questo metodo restituisce true se l'argomento Object specificato può essere convertito in un oggetto della classe array mediante una conversione di identità o una conversione di riferimento di ampliamento; altrimenti restituisce false. Se questo oggetto Class rappresenta un'interfaccia, questo metodo restituisce true se la classe o qualsiasi superclasse dell'argomento Object specificato implementa questa interfaccia; altrimenti restituisce false. Se questo oggetto Class rappresenta un tipo primitivo, questo metodo restituisce false.
Parametri: obj - l'oggetto da controllare
Restituisce: true se obj è un'istanza di questa classe
Da: JDK1.1