Si clase B
y clase C
extienden clase A
y tengo un objeto de tipo B
o C
, ¿cómo puedo determinar de qué tipo es una instancia?
java
inheritance
portador
fuente
fuente
Respuestas:
fuente
if(!(obj instanceof C))
code
Child1 child1 = new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = new Child2 (); (instancia child1 de Parent1); (child1 instanceof Child1); (parentChild instanceof Child2); (parentChild instanceof Parent1); (parentChild instanceof Child1);code
, puede borrar la intención de instancia de.Use Object.getClass () . Devuelve el tipo de tiempo de ejecución del objeto.
fuente
Se presentaron múltiples respuestas correctas, pero todavía hay más métodos:
Class.isAssignableFrom()
y simplemente intentar lanzar el objeto (que podría arrojar unClassCastException
).Posibles formas resumidas
Resumamos las posibles formas de probar si un objeto
obj
es una instancia de tipoC
:Diferencias en el
null
manejoSin
null
embargo, hay una diferencia en el manejo:false
siobj
esnull
(null
no es una instancia de nada).NullPointerException
obviamente.null
porquenull
se pueden lanzar a cualquier tipo.Notas
Class.getName()
no debe usarse para realizar una prueba "es-instancia-de" porque si el objeto no es de tipoC
sino una subclase de él, puede tener un nombre y un paquete completamente diferentes (por lo tanto, los nombres de clase obviamente no coincidirán) pero es Todavía de tipoC
.Class.isAssignableFrom()
no es simétrica :obj.getClass().isAssignableFrom(C.class)
regresaríafalse
si el tipo deobj
es una subclase deC
.fuente
Puedes usar:
HTH Pero creo que la mayoría de las veces no es una buena práctica usar eso para controlar el flujo o algo similar ...
fuente
Cualquier uso de cualquiera de los métodos sugeridos se considera un olor a código que se basa en un mal diseño de OO.
Si su diseño es bueno, no debería necesitar usar
getClass()
oinstanceof
.Cualquiera de los métodos sugeridos servirá, pero es algo a tener en cuenta, en cuanto al diseño.
fuente
Podemos usar la reflexión en este caso
Ejemplo:-
En este caso, obtendrá el nombre de la clase que el objeto pasa a la
HttpServletRequest
variable de referencia de la interfaz.fuente
obj.getClass()
devolverá el className, prefixex por la palabraclass
request.getClass().getName();
imprime todo el paquete! junto con el nombre de la claseTambién hay un
.isInstance
método en laClass
clase " ". si obtiene la clase de un objeto a través demyBanana.getClass()
, puede ver si su objetomyApple
es una instancia de la misma clase que amyBanana
través defuente
consultar con
isinstance()
no sería suficiente si quieres saber en tiempo de ejecución. utilizar:fuente
Uso la función de soplado en mi clase GeneralUtils, verifique que puede ser útil
fuente
Usé genéricos de Java 8 para obtener cuál es la instancia del objeto en tiempo de ejecución en lugar de tener que usar la caja del interruptor
pase cualquier tipo de datos y el método imprimirá el tipo de datos que pasó mientras lo llamaba. p.ej
Siguiente es la salida
fuente