¿Por qué no se compila este código?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
¿Por qué no puedo pasar una variable de clase a instanceof
?
java
class
instanceof
eric2323223
fuente
fuente
Integer
no es un literal de clase.Integer.class
sería un literal de clase (ver § 15.8.2 de JLS: java.sun.com/docs/books/jls/third_edition/html/… ). Elinstanceof
operador toma un "ReferenceType" (también conocido como un nombre de tipo) como se especifica en § 15.20.2 de JLS: java.sun.com/docs/books/jls/third_edition/html/…clazz.isInstance(obj)
ya que el objeto ya se ha proporcionado.instanceof
solo se puede usar con nombres de clase explícitos (indicados en el momento de la compilación). Para realizar una verificación de tiempo de ejecución , debe hacer:Esto tiene una pequeña ventaja,
clazz.isAssignableFrom(..)
ya que se ocupaobj == null
mejor del caso .fuente
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 deinstanceof
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
, yo
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, peroclazz
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:
fuente
En primer lugar,
instanceof
requiere que el operando de la derecha sea una clase real (por ejemplo,obj instanceof Object
oobj instanceof Integer
) y no una variable de tipoClass
. En segundo lugar, ha cometido un error de novato bastante común que realmente no debería hacer ... el siguiente patrón:Lo anterior se puede refactorizar en:
Siempre debe realizar esa refactorización, ya que elimina una instrucción if ... else redundante. De manera similar, la expresión se puede refactorizar al mismo resultado.
return conditional_expression ? true : false;
fuente