2009-03-10 5 views
12

¿Hay algo complicado que deba saber sobre instanceof? Estoy pasando una lista de objetos a través de algunos métodos y probando si estos objetos implementan una interfaz particular usando instanceof. En algunos casos, instanceof identifica correctamente los objetos como implementadores de la interfaz, en otros casos no. Parece que me está dando resultados inconsistentes sobre el mismo objeto en diferentes lugares. ¿Hay algún truco/gotcha que deba tener en cuenta aquí?instanciaof produce resultados inconsistentes para la detección de interfaces?

A la espera de los comentarios que pueda tener:

1) Sé instanceof es de mala educación. Estoy trabajando con una jerarquía de objetos menos que perfecta que no se puede cambiar, y esto es lo menos malo que puedo hacer.

2) Estoy trabajando para crear un ejemplo de código, pero tendré que simplificar mucho mi código si voy a pegar algo útil aquí. Mientras tanto, si has visto esto antes y puedes arrojar algo de luz, hazlo.

+0

¿Alguna posibilidad de obtener una muestra de código? – Rontologist

+0

Es solo una suposición, pero es muy posible que simplificar el código para publicar una muestra pueda exponer el problema. instanceof es un operador, por lo que siempre debería funcionar igual. –

+0

Sí, mi suposición es que si simplifico mi código lo suficiente para pegarlo para todos ustedes útiles, encontraré el error y no necesitaré :) – morgancodes

Respuesta

4

Lo único que tengo entendido es que null es instanceof no hay tipo.

+0

+1 ¡Estuche fresco! – HDave

+0

Tuve un momento increíble de realización aquí. –

13

¿Está cargando cualquier tipo de forma dinámica, potencialmente desde diferentes clasificadores? La única vez que he visto resultados aparentemente inconsistentes fue cuando tenía dos líneas de código que miran como si se refirieran al mismo tipo, pero que realmente han cargado ese tipo desde diferentes cargadores de clases.

+0

Gosh, no lo creo. La extrañeza está apareciendo cuando se ejecuta un caso simple de prueba junit. Esto me da suficiente información para asumir que he hecho algo tonto y solo necesito simplificar. Gracias. – morgancodes

-1

Usted puede faltar "isAssignable" en lugar de instanceof:

if (MyInterface.isAssignableFrom(myObject.getClass())) { 
    // do work here 
} 

Esto devolverá cierto para las clases que implementan la interfaz.

+0

También lo hace instanceof. –

+0

Exactamente igual que instanceof, pero arroja un NPE si myObject es nulo. – cadrian

+0

... mejor usar MyInterface.class.isInstance (myObject) - esto no arroja un NPE. Incluso esto no tiene sentido si conoce MyInterface en el momento de la compilación, también podría usar instanceof –

9

instanceof siempre devuelve false para null. No compila si sería imposible que el tipo estático de la izquierda no pueda ser una instancia del tipo especificado. Aparte de eso, debería funcionar sin sorpresa.

A diferencia de C++ (y creo Smalltalk), un objeto no puede cambiar el tipo en tiempo de ejecución. En C++, el tipo cambia durante la construcción, por lo que los métodos no pueden llamarse desde un constructor a métodos de clase derivados [subclase].

3

Siempre y cuando no tenga un problema de carga de clases, instanceof funciona de forma coherente. Supongo que usted sabe Una instancia de B devuelve verdadero si A se hereda de B, o algunas de las interfaces A se implementan o las clases A se extienden, son instancia de B.

Si obtiene falso cuando espera verdadero, es probable que tratando de comparar instancias procedentes de diferentes ClassLoaders.

9

Ok, problema resuelto. Como de costumbre, el problema fue menos extraño de lo que pensaba. El proyecto en el que estoy trabajando se encuentra en la desafortunada condición de tener algunos nombres de clase duplicados. Estaba creando la clase usando foo.MyInterface y probando, por ejemplo, bar.MyInterface. Gracias por las respuestas. Realmente me ayudó a pensarlo bien.

+3

Irónicamente, casi incluí esta posibilidad en mi respuesta, pero por alguna razón no lo hice al final. Eso me enseñará - la próxima vez publicaré todas las ideas, no importa cuán tonto :) –

+0

Gracias por responder a tu propia pregunta, ¡también fue mi tonto error! –

Cuestiones relacionadas