java inheritance rtti typing

Java isInstance vs instanceOf operator



inheritance rtti (3)

Todo el asunto de los genéricos me está dando un vuelco, y más aún el RTT.

Specificis? Ah, bueno, aquí está la esencia:

enum QueryHelper { query1, query2; static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) { if (expectedReturn.isInstance (SomeRelatedClass.class)) return query1; else return query2; } }

y luego lo llamaría así:

... QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class); ...

Esto es para poder asignar de manera flexible el tipo de retorno de consulta en el asistente real. Hace algo de fundición y creación de objetos. Lo que estoy viendo es que no hay coincidencia, ¿debería estar haciendo esto de otra manera? ¿O toda la idea es mala?

Y el verdadero corazón de esto es que no entiendo la diferencia entre class.isInstance y el operador instanceOf? ¿Debo usar el último?


Esto es para poder asignar de manera flexible el tipo de retorno de consulta en el asistente real.

No hay nada flexible sobre el tipo de devolución de este método

static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) { if (expectedReturn.isInstance (SomeRelatedClass.class)) return query1; else return query2; }

Siempre devolverá una instancia de QueryHelper . Si desea que el tipo de devolución sea flexible, deberá definirlo de la siguiente manera:

static <T> T getQueryHelper (Class<T> expectedReturn) { }

Ahora el tipo de devolución es flexible, ya que dependerá del tipo de argumento

Y el verdadero corazón de esto es que no entiendo la diferencia entre class.isInstance y el operador instanceOf?

La diferencia es que instanceof hace una comprobación de tipo que se arregla en tiempo de compilación, por ejemplo:

static boolean isInstance(Object myVar) { return (myVar instanceof Foo); }

siempre comprobará que myVar es una instancia de Foo, mientras que

static <T> boolean isInstance(Object myVar, Class<T> expectedType) { return expectedType.isInstance(myVar); }

comprobará que myVar es una instancia de expectedType, pero expectedType puede ser de un tipo diferente cada vez que se llame al método


Class.isInstance () no funciona como espera su código. Comprueba si el objeto que le pasas es una instancia de la clase. En tu código:

expectedReturn.isInstance(SomeRelatedClass.class)

El objeto que estás pasando es un objeto Clase. Pruebe esto en su lugar, que devuelve verdadero:

Class.class.isInstance(SomeRelatedClass.class);

Lo que probablemente esté buscando es Class.isAssignableFrom() , por ejemplo:

Object.class.isAssignableFrom(Class.class);

Significa que puedes hacer esto:

Class klass = ...; Object o = klass;


El argumento esperado de isInstance es un objeto que puede ser una instancia de la clase que representa su objeto de clase. Lo que está comparando es una instancia de la clase ... java.lang.Class ! Entonces no va a coincidir.

por ejemplo, sería cierto:

Class.class.isInstance(SomeRelatedClass.class);

También sería cierto (sin comentarios arquitectónicos sobre la cordura de realmente construir su ayudante de consulta de esta manera)

expectedReturn.isInstance(new SomeRelatedClass());