Por que este código não compila?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Por que não posso passar uma variável de classe para instanceof
?
java
class
instanceof
eric2323223
fonte
fonte
Integer
não é uma classe literal.Integer.class
seria um literal de classe (ver § 15.8.2 do JLS: java.sun.com/docs/books/jls/third_edition/html/… ). Oinstanceof
operador usa um "ReferenceType" (também conhecido como nome de tipo) conforme especificado § 15.20.2 do JLS: java.sun.com/docs/books/jls/third_edition/html/…clazz.isInstance(obj)
pois o objeto já foi fornecido.instanceof
pode ser usado apenas com nomes de classe explícitos (declarados em tempo de compilação). Para fazer uma verificação de tempo de execução , você deve fazer:Isso tem uma pequena vantagem,
clazz.isAssignableFrom(..)
pois lidaobj == null
melhor com o case .fonte
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 deinstanceof
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
eo
é 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, masclazz
é 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:
fonte
Em primeiro lugar,
instanceof
requer que o operando à direita seja uma classe real (por exemplo,obj instanceof Object
ouobj instanceof Integer
) e não uma variável do tipoClass
. Em segundo lugar, você cometeu um erro bastante comum de novato que realmente não deveria fazer ... o seguinte padrão:O acima pode ser refatorado em:
Você deve sempre executar essa refatoração, pois ela elimina uma instrução if ... else redundante. Da mesma forma, a expressão é refatorável para o mesmo resultado.
return conditional_expression ? true : false;
fonte