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?
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?
Respuestas:
if (obj instanceof C) {
//your code
}
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.
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 un ClassCastException
).
Resumamos las posibles formas de probar si un objeto obj
es una instancia de tipo C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
manejoSin null
embargo, hay una diferencia en el manejo:
false
si obj
es null
( null
no es una instancia de nada).NullPointerException
obviamente.null
porque null
se pueden lanzar a cualquier tipo.Para recordar:
null
no es una instancia de ningún tipo, pero se puede convertir a cualquier tipo.
Class.getName()
no debe usarse para realizar una prueba "es-instancia-de" porque si el objeto no es de tipo C
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 tipo C
.Class.isAssignableFrom()
no es simétrica : obj.getClass().isAssignableFrom(C.class)
regresaría false
si el tipo de obj
es una subclase de C
.Puedes usar:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
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 ...
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()
o instanceof
.
Cualquiera de los métodos sugeridos servirá, pero es algo a tener en cuenta, en cuanto al diseño.
Podemos usar la reflexión en este caso
objectName.getClass().getName();
Ejemplo:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
En este caso, obtendrá el nombre de la clase que el objeto pasa a la HttpServletRequest
variable de referencia de la interfaz.
obj.getClass()
devolverá el className, prefixex por la palabraclass
request.getClass().getName();
imprime todo el paquete! junto con el nombre de la clase
También hay un .isInstance
método en la Class
clase " ". si obtiene la clase de un objeto a través de myBanana.getClass()
, puede ver si su objeto myApple
es una instancia de la misma clase que a myBanana
través de
myBanana.getClass().isInstance(myApple)
consultar con isinstance()
no sería suficiente si quieres saber en tiempo de ejecución. utilizar:
if(someObject.getClass().equals(C.class){
// do something
}
Uso la función de soplado en mi clase GeneralUtils, verifique que puede ser útil
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
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
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
pase cualquier tipo de datos y el método imprimirá el tipo de datos que pasó mientras lo llamaba. p.ej
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
Siguiente es la salida
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []