Como outros mencionaram, você não pode passar uma variável de classe para instanceof
porque uma variável de classe faz referência a uma instância de um objeto , enquanto a mão direita de instanceof
tem que ser um tipo . Ou seja, instanceof
não significa "y é uma instância do objeto x", significa "y é uma instância do tipo X". Caso você não saiba a diferença entre um objeto e um tipo, considere:
Object o = new Object();
Aqui, o tipo é Object
e o
é uma referência à instância do Object com esse tipo. Portanto:
if(o instanceof Object)
é válido mas
if(o instanceof o)
não é porque o
do lado direito está um objeto, não um tipo.
Mais específico para o seu caso, uma instância de classe não é um tipo, é um Objeto (que é criado para você pela JVM). Em seu método, Class
é um tipo, mas clazz
é um objeto (bem, uma referência a um objeto)
O que você precisa é uma maneira de comparar um objeto a um objeto de classe. Acontece que este é popular por isso este é fornecido a você como um método do objeto de classe: isInstance()
.
Aqui está o Java Doc para isInstance, que explica isso melhor:
public boolean isInstance(Object obj)
Determina se o Object especificado é compatível com a atribuição do objeto representado por esta classe. Este método é o equivalente dinâmico do operador instanceof da linguagem Java. O método retorna true se o argumento Object especificado não for nulo e pode ser convertido para o tipo de referência representado por este objeto Class sem gerar uma ClassCastException. Caso contrário, retorna falso.
Especificamente, se este objeto Class representa uma classe declarada, este método retorna true se o argumento Object especificado for uma instância da classe representada (ou de qualquer uma de suas subclasses); caso contrário, retorna falso. Se este objeto Class representa uma classe de array, este método retorna true se o argumento Object especificado pode ser convertido em um objeto da classe de array por uma conversão de identidade ou por uma conversão de referência de alargamento; caso contrário, retorna falso. Se este objeto Class representa uma interface, este método retorna true se a classe ou qualquer superclasse do argumento Object especificado implementa esta interface; caso contrário, retorna falso. Se este objeto Class representa um tipo primitivo, este método retorna falso.
Parâmetros: obj - o objeto a ser verificado
Retorna: true se obj for uma instância desta classe
Desde: JDK1.1