¿Para qué se instanceof
utiliza el operador? He visto cosas como
if (source instanceof Button) {
//...
} else {
//...
}
Pero nada de eso tenía sentido para mí. He hecho mi investigación, pero solo encontré ejemplos sin ninguna explicación.
java
instanceof
Ben
fuente
fuente
instanceof
anularequals
?Respuestas:
instanceof
La palabra clave es un operador binario utilizado para probar si un objeto (instancia) es un subtipo de un tipo dado.Imagina:
Imagine un
dog
objeto , creado conObject dog = new Dog()
, entonces:Sin embargo, con
Object animal = new Animal();
,porque
Animal
es un supertipo deDog
y posiblemente menos "refinado".Y,
Esto se debe a
Dog
que no es un subtipo ni un supertipo deCat
, y tampoco lo implementa.Tenga en cuenta que la variable utilizada para
dog
arriba es de tipoObject
. Esto es para mostrar queinstanceof
es una operación en tiempo de ejecución y nos lleva a un / el caso de uso: reaccionar de manera diferente en función de un tipo de objetos en tiempo de ejecución .Cosas a tener en cuenta:
expressionThatIsNull instanceof T
es falso para todos los tiposT
.Feliz codificación
fuente
Object dog = new Dog(); System.out.println(dog instanceof Cat);
. Esto compila muy bien e imprimefalse
. El compilador no puede determinar en el momento de la compilación quedog
no puede ser un gato (según las reglas en el JLS)boolean b = "foo" instanceof Integer;
Object indirect = ...; if (indirect instanceof Something)
. No se trata de loif (literal instanceof Something)
que parece estar asumiendo.Object dog
parte. ¡Culpa mía!dog instanceof Cat // does not even compile!
(porque es una clase) SiCat
fuera una interfaz, entonces se compilaría.Es un operador que devuelve verdadero si el lado izquierdo de la expresión es una instancia del nombre de la clase en el lado derecho.
Piensa en ello de esta manera. Digamos que todas las casas en su cuadra fueron construidas con los mismos planos. Diez casas (objetos), un conjunto de planos (definición de clase).
instanceof
es una herramienta útil cuando tienes una colección de objetos y no estás seguro de cuáles son. Digamos que tienes una colección de controles en un formulario. Desea leer el estado marcado de las casillas de verificación que haya allí, pero no puede pedirle a un objeto antiguo simple su estado marcado. En cambio, vería si cada objeto es una casilla de verificación, y si lo es, conviértalo en una casilla de verificación y verifique sus propiedades.fuente
instanceof
puede hacer que sea seguro bajarlos.Como se describe en este sitio :
¡Espero que esto ayude!
fuente
Este operador le permite determinar el tipo de un objeto. Devuelve un
boolean
valor.Por ejemplo
la salida es:
fuente
Si
source
es unaobject
variable,instanceof
es una forma de verificar si esButton
o no.fuente
Como se menciona en otras respuestas, el uso típico canónico
instanceof
es para verificar si un identificador se refiere a un tipo más específico. Ejemplo:Sin embargo, tenga en cuenta que el tipo de la expresión de la izquierda debe ser un tipo primario de la expresión de la derecha (vea JLS 15.20.2 y Java Puzzlers, # 50, pp114 ). Por ejemplo, lo siguiente no se compilará:
Esto no se compila con el mensaje:
Como
Test
no es una clase padre deString
. OTOH, esto se compila perfectamente e imprimefalse
como se esperaba:fuente
fuente
Se puede utilizar como taquigrafía en la verificación de igualdad.
fuente
La mayoría de las personas han explicado correctamente el "Qué" de esta pregunta, pero nadie explicó "Cómo" correctamente.
Así que aquí hay una ilustración simple:
Salidas:
La razón del error del compilador al comparar
s
con StringBuffer se explica bien en los documentos :lo que implica que el LHS debe ser una instancia de RHS o de una Clase que implemente RHS o extienda RHS.
¿Cómo usar use instanceof entonces?
Dado que cada Clase extiende Objeto, la conversión de tipos de LHS a objeto siempre funcionará a su favor:
Salidas:
fuente
if ((Object)s instanceof StringBuffer) System.out.println("Instance of StringBuffer"); //shouldn't this be true
, ya que estamos tipeando s a Object?http://download.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
fuente
La instancia de la palabra clave es útil cuando desea conocer la instancia de un objeto en particular.
Suponga que es una excepción de lanzamiento y cuando tiene captura, realice una operación personalizada de suma y luego continúe nuevamente según su lógica (lanzamientos o registro, etc.)
Ejemplo: 1) El usuario creó la excepción personalizada "InvalidExtensionsException" y la arrojó según la lógica
2) Ahora en catch block catch (Exception e) {realice la lógica de suma si el tipo de excepción es "InvalidExtensionsException"
3) Si no está verificando la instancia y el tipo de excepción es la excepción de puntero nulo, su código se romperá.
Por lo tanto, su lógica debe estar dentro de la instancia de if (e instanceof InvalidExtensionsException) {InvalidExtensionsException InvalidException = (InvalidExtensionsException) e; }
El ejemplo anterior es una práctica de codificación incorrecta. Sin embargo, este ejemplo le ayuda a comprender el uso de la instancia.
fuente
La mejor explicación es jls . Siempre trate de verificar lo que dice la fuente. Allí obtendrá la mejor respuesta y mucho más. Reproduciendo algunas partes aquí:
fuente
El
instanceof
operador java se utiliza para probar si el objeto es una instancia del tipo especificado (clase, subclase o interfaz).La instancia de java también se conoce como tipo,
comparison operator
ya que compara la instancia con el tipo. Devuelve ya seatrue
ofalse
. Si aplicamos elinstanceof
operador con cualquier variable que tenganull
valor, devuelvefalse
.Desde JDK 14+ que incluye JEP 305 también podemos hacer "Pattern Matching" para
instanceof
Los patrones básicamente prueban que un valor tiene un cierto tipo y pueden extraer información del valor cuando tiene el tipo correspondiente. La coincidencia de patrones permite una expresión más clara y eficiente de la lógica común en un sistema, es decir, la eliminación condicional de componentes de los objetos.
Antes de Java 14
Mejoras de Java 14
También podemos combinar la verificación de tipo y otras condiciones juntas
El uso de la coincidencia de patrones
instanceof
debería reducir el número total de conversiones explícitas en los programas Java.PD :
instanceOf
solo coincidirá cuando el objeto no sea nulo, luego solo se le puede asignarstr
.fuente
fuente
Ejemplo de código muy simple:
Ten cuidado aquí. En el ejemplo anterior, si Class1 es Object, la primera comparación siempre será verdadera. Entonces, al igual que con las excepciones, ¡el orden jerárquico es importante!
fuente
Puede usar Map para hacer una mayor abstracción en caso de
Luego, al hacer que dicho mapa agregue alguna acción:
Luego, al tener un Objeto de tipo desconocido, puede obtener una acción específica de ese mapa:
fuente
El operador instanceof se usa para verificar si el objeto es una instancia del tipo especificado. (clase o subclase o interfaz).
La instancia de también se conoce como operador de comparación de tipos porque compara la instancia con el tipo. Devuelve verdadero o falso.
Si aplicamos el operador instanceof con cualquier variable que tenga un valor nulo, devuelve falso.
fuente