Como han mencionado otros, no puede pasar una variable de clase a instanceof
porque una variable de clase hace referencia a una instancia de un Objeto , mientras que la mano derecha de instanceof
tiene que ser un tipo . Es decir, instanceof
no significa "y es una instancia del Objeto x", significa "y es una instancia del tipo X". En caso de que no sepa la diferencia entre un objeto y un tipo, considere:
Object o = new Object();
Aquí, el tipo es Object
, y o
es una referencia a la instancia del Objeto con ese tipo. Así:
if(o instanceof Object)
es válido pero
if(o instanceof o)
no es porque o
en el lado derecho hay un Objeto, no un tipo.
Más específico para su caso, una instancia de clase no es un tipo, es un Objeto (que la JVM crea para usted). En su método, Class
es un tipo, pero clazz
es un Objeto (bueno, una referencia a un Objeto)
Lo que necesita es una forma de comparar un objeto con un objeto de clase. Resulta que este es muy popular por lo que este se le proporciona como un método de la clase de objeto: isInstance()
.
Aquí está el Java Doc para isInstance, que explica esto mejor:
public boolean isInstance(Object obj)
Determina si el objeto especificado es compatible con la asignación del objeto representado por esta clase. Este método es el equivalente dinámico del operador instanceof del lenguaje Java. El método devuelve verdadero si el argumento Object especificado no es nulo y se puede convertir al tipo de referencia representado por este objeto Class sin generar una ClassCastException. Devuelve falso de lo contrario.
Específicamente, si este objeto Clase representa una clase declarada, este método devuelve verdadero si el argumento Objeto especificado es una instancia de la clase representada (o de cualquiera de sus subclases); devuelve falso en caso contrario. Si este objeto Class representa una clase de matriz, este método devuelve verdadero si el argumento Object especificado se puede convertir en un objeto de la clase de matriz mediante una conversión de identidad o una conversión de referencia de ampliación; devuelve falso en caso contrario. Si este objeto Clase representa una interfaz, este método devuelve verdadero si la clase o cualquier superclase del argumento Objeto especificado implementa esta interfaz; devuelve falso en caso contrario. Si este objeto Class representa un tipo primitivo, este método devuelve falso.
Parámetros: obj - el objeto a verificar
Devuelve: verdadero si obj es una instancia de esta clase
Desde: JDK1.1