2009-06-04 14 views
73

Quiero comprobar si un objeto o es una instancia de la clase C o de una subclase de C.¿Hay algo como instanceOf (clase <?> c) en Java?

Por ejemplo, si es de la clase pPoint Quiero x.instanceOf(Point.class) ser true y también x.instanceOf(Object.class) para ser true.

Quiero que funcione también para los tipos primitivos en caja. Por ejemplo, si x es un Integer, entonces x.instanceOf(Integer.class) debe ser true.

¿Existe tal cosa? Si no, ¿cómo puedo implementar tal método?

+0

clases de manejo en caja es un poco desordenado – dfa

Respuesta

141

Class.isInstance hace lo que quiere.

if (Point.class.isInstance(someObj)){ 
    ... 
} 

Por supuesto, no se debe usar si usted podría utilizar instanceof lugar, pero para los escenarios de reflexión que a menudo viene muy bien.

+0

¿Por qué no deberíamos usar? cualquier problema de rendimiento? – Ahamed

+6

@Ahamed es probable que sea más lento, pero lo peor es que es más difícil de entender. Si hay una manera muy simple de hacer algo, como 'if (una instancia de Point)' - pero lo haces de una forma más enrevesada, quien lea el código pensará "oh, tiene que haber una razón para esto". se hace de la manera difícil ", y luego salta a los documentos para descubrir cómo' Class.isInstance' difiere de 'instanceof'. Pierdes el tiempo de tus colegas. – gustafc

8
x instanceof Integer 
x instanceof Object 

sólo hay que utilizar la sintaxis correcta

para este tipo de primitve, hay que hacerlo completamente diferente. Como 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.

0

Usted puede hacer:

if (foo instanceof classNameYouWantToCheck) 
+0

no se puede utilizar instanceof con tipos primitivos – dfa

+0

la clase era sólo para mostrar que debería escribir el nombre de clase allí. Lo arreglaré – fmsf

4

De hecho en Java hay un operador booleano llamado instanceof que se puede utilizar 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 particular.

if(obj instanceof SomeClass) { 
    // Do something 
} 

El Tutorial de Java tiene un good example de este operador

+1

no puedes usar instanceof con tipos primitivos – dfa

+4

Confundió tipos primitivos con objetos. Por favor, lea ... "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". Es una lástima, votando todas las respuestas –

+0

Secundando (sp) la sugerencia de usar el Tutorial de Java. Es una buena referencia para aprender el idioma en sí. –

19

Quiero comprobar si un objeto o es un 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)

Um ... ¿Qué? ¿Qué son o, p yx?

Quiero que funcione también para tipos primitivos . Por ejemplo, si x es un entero , entonces x.instanceOf (Integer.class) y también x.instanceOf (Object.class) debería ser true.

No. Ni siquiera debería compilar. Los primitivos no son objetos y no se pueden invocar métodos sobre ellos.

De todos modos, hay tres cosas, uno de los cuales sin duda puede lograr lo que quiere (que difieren algo en donde se aplican exactamente:

  • El operador instanceof si usted sabe la clase en tiempo de compilación.
  • Class.isInstance() si desea verificar la clase de un objeto con una clase desconocida en tiempo de compilación.
  • Class.isAssignableFrom() si desea verificar la asignabilidad de dos objetos de clase.
0

"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 primitivo int no es un subtipo de Entero ni Objeto. 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 boxear un valor primitivo y luego probar su tipo:

(Integer)5 instanceof Integer 

¿Pero cuál sería el punto?

-1

Creo que está confundido acerca de instanceof para objetos primas y los genéricos

obj instanceof Class 
obj instanceof Class<?> // this is the one you want 
+1

No se pueden usar genéricos en el lado derecho del operador instanceof debido a borrado de tipo. – Matthias

+0

No, es usted quien está confundido al respecto. Tienes que usar el tipo sin procesar después de 'instanceof'. –

Cuestiones relacionadas