2012-01-01 17 views

Respuesta

45

creo que el oficial documentation le da la respuesta a ésta (aunque de una forma bastante inespecífica):

Este método es el equivalente dinámico del lenguaje Java instanceof operador.

Supongo que isInstance() está destinado principalmente para su uso en el código que trata sobre el tipo de reflexión en tiempo de ejecución. En particular, diría que existe para manejar casos en los que es posible que no sepa de antemano el tipo (s) de clase (s) que desea verificar con anticipación para la membresía (por raros que sean esos casos).

Por ejemplo, puede usarlo para escribir un método que comprueba si dos objetos se escriben de forma arbitraria asignación compatible, como:

public boolean areObjectsAssignable(Object left, Object right) { 
    return left.getClass().isInstance(right); 
} 

En general, diría que el uso debe ser instanceof preferido siempre que conozca el tipo de clase que desea verificar con antelación. En esos raros casos en los que no lo hace, use isInstance() en su lugar.

+6

Otro caso de uso típico para el método 'isInstance' es cuando se trata de genéricos. Hay muchas situaciones en las que tiene el objeto 'Clase ', y la única forma de comprobar si un objeto pertenece a esa clase es el método 'isInstance' – Robin

48

Para instanceof necesita saber la clase exacta en tiempo de compilación.

if (foo instanceof ThisClassIKnowRightNow) 
    ... 

Para isInstance la clase se decide en tiempo de ejecución. (enlace tardío) p.

if (someObject.getClass().isInstance(foo)) 
    ... 
+9

+1: Al grano. También con flujos Java 8, '.filter (ThisClassIKnowRightNow.class :: isInstance)' es un poco más conciso que '.filter (o -> o instanceof ThisClassIKnowRightNow)'. – antak

Cuestiones relacionadas