Si clase By clase Cextienden clase Ay tengo un objeto de tipo Bo C, ¿cómo puedo determinar de qué tipo es una instancia?
Si clase By clase Cextienden clase Ay tengo un objeto de tipo Bo 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 objes 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) {
}
nullmanejoSin nullembargo, hay una diferencia en el manejo:
falsesi objes null( nullno es una instancia de nada).NullPointerExceptionobviamente.nullporque nullse pueden lanzar a cualquier tipo.Para recordar:
nullno 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 Csino 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 falsesi el tipo de objes 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 HttpServletRequestvariable 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 .isInstancemétodo en la Classclase " ". si obtiene la clase de un objeto a través de myBanana.getClass(), puede ver si su objeto myApplees una instancia de la misma clase que a myBananatravé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 []