Si clase By clase Cextienden clase Ay tengo un objeto de tipo Bo C, ¿cómo puedo determinar de qué tipo es una instancia?
java
inheritance
portador
fuente
fuente

Respuestas:
fuente
if(!(obj instanceof C))codeChild1 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
objes una instancia de tipoC:Diferencias en el
nullmanejoSin
nullembargo, hay una diferencia en el manejo:falsesiobjesnull(nullno es una instancia de nada).NullPointerExceptionobviamente.nullporquenullse 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 tipoCsino 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íafalsesi el tipo deobjes 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
HttpServletRequestvariable de referencia de la interfaz.fuente
obj.getClass()devolverá el className, prefixex por la palabraclassrequest.getClass().getName();imprime todo el paquete! junto con el nombre de la claseTambién hay un
.isInstancemétodo en laClassclase " ". si obtiene la clase de un objeto a través demyBanana.getClass(), puede ver si su objetomyApplees una instancia de la misma clase que amyBananatravé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