¿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

Integerno es un literal de clase.Integer.classsería un literal de clase (ver § 15.8.2 de JLS: java.sun.com/docs/books/jls/third_edition/html/… ). Elinstanceofoperador 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.instanceofsolo 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 == nullmejor del caso .fuente
Como han mencionado otros, no puede pasar una variable de clase a
instanceofporque una variable de clase hace referencia a una instancia de un Objeto , mientras que la mano derecha deinstanceoftiene que ser un tipo . Es decir,instanceofno 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, yoes 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
oen 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,
Classes un tipo, peroclazzes 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,
instanceofrequiere que el operando de la derecha sea una clase real (por ejemplo,obj instanceof Objectoobj 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:if ( conditional_expression ) { devuelve verdadero; } más { falso retorno; }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