Quiero comprobar si un objeto o
es una instancia de la clase C
o de una subclase de C
.
Por ejemplo, si p
es de la clase Point
quiero x.instanceOf(Point.class)
ser true
y también x.instanceOf(Object.class)
ser true
.
Quiero que funcione también para tipos primitivos en caja. Por ejemplo, si x
es un Integer
entonces x.instanceOf(Integer.class)
debería ser true
.
¿Existe tal cosa? Si no es así, ¿cómo puedo implementar tal método?
java
reflection
instanceof
Snakile
fuente
fuente
Respuestas:
Class.isInstance hace lo que quiere.
if (Point.class.isInstance(someObj)){ ... }
Por supuesto, no debería usarlo si pudiera usarlo
instanceof
en su lugar, pero para escenarios de reflexión a menudo es útil.fuente
if (a instanceof Point)
, pero lo haces de una manera más complicada, quien lea el código seguramente pensará "oh, tiene que haber una razón para que esto se haga de la manera difícil", y luego vaya a los documentos para averiguar en qué seClass.isInstance
diferencia deinstanceof
. Pierdes el tiempo de tus compañeros.¿Um que? ¿Qué son o, p y x?
No. Ni siquiera debería compilarse. Los primitivos no son objetos y no puede llamar a métodos sobre ellos.
De todos modos, hay tres cosas, una de las cuales definitivamente puede lograr lo que quieres (difieren un poco en dónde exactamente se aplican:
instanceof
operador si conoce la clase en tiempo de compilación.fuente
x instanceof Integer x instanceof Object
solo tienes que usar la sintaxis correcta
para los tipos primitivos, tienes que hacerlo completamente diferente. Dado que no puede crear métodos para ellos, necesita una clase que mantenga el método. Entonces, en lugar de "x.instanceOf (Integer.Class)", debe llamar a "MyClassComparer.instanceOf (x, Integer.Class)" o algo así. Esto podría implementarse fácilmente mediante métodos de sobrecarga, pero no veo un caso en el que esa funcionalidad sea deseable en absoluto.
fuente
De hecho, en Java hay un operador booleano llamado instanceof que se puede usar para determinar si un objeto es una instancia de una clase, una instancia de una subclase o una instancia de una clase que implementa una interfaz en particular.
if(obj instanceof SomeClass) { // Do something }
El tutorial de Java tiene un buen ejemplo de este operador
fuente
Tu puedes hacer:
if (foo instanceof classNameYouWantToCheck)
fuente
"Quiero que funcione también para tipos primitivos. Por ejemplo, si x es un número entero, entonces x.instanceOf (Integer.class) y también x.instanceOf (Object.class) deberían ser verdaderas".
¿Por qué? Los tipos primitivos y los tipos de referencia están completamente separados. Un int primitivo no es un subtipo de Integer ni Object. El tipo de un valor primitivo siempre se conoce estáticamente en tiempo de compilación, por lo que no tiene sentido probar su tipo. Claro, puede enmarcar un valor primitivo y luego probar su tipo:
(Integer)5 instanceof Integer
Pero cuál sería el punto?
fuente
Creo que estás confundido acerca de instanceof para objetos sin formato y genéricos
obj instanceof Class obj instanceof Class<?> // this is the one you want
fuente
instanceof
.