2012-01-01 23 views

risposta

45

penso che il funzionario documentation ti dà la risposta a questa domanda (anche se in modo piuttosto aspecifico):

Questo metodo è l'equivalente dinamica del linguaggio Java instanceof operatore.

Prendo questo per indicare che isInstance() è destinato principalmente all'utilizzo nel codice che si occupa della riflessione del tipo in fase di esecuzione. In particolare, direi che esiste per gestire casi in cui potresti non sapere in anticipo il/i tipo/i di classe/e che vuoi controllare in anticipo per l'appartenenza (raramente anche se questi casi lo sono).

Per esempio, è possibile utilizzarlo per scrivere un metodo che consente di verificare se due oggetti arbitrariamente sono stampati assegnazione-compatibili, come:

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

In generale, direi che l'utilizzo instanceof dovrebbe essere preferito ogni volta che conosci il tipo di lezione che vuoi controllare in anticipo. In quei casi molto rari in cui non lo fai, usa invece isInstance().

+6

Un altro caso d'uso tipico per il metodo 'isInstance' riguarda i generici. Ci sono molte situazioni in cui si ha l'oggetto 'Classe ' e l'unico modo per controllare se un oggetto appartiene a quella classe è il metodo 'isInstance' – Robin

48

Per instanceof è necessario conoscere la classe esatta in fase di compilazione.

if (foo instanceof ThisClassIKnowRightNow) 
    ... 

Per isInstance la classe viene decisa in fase di esecuzione. (legatura tardiva) per es.

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

+1: Al punto. Anche con gli stream Java 8, '.filter (ThisClassIKnowRightNow.class :: isInstance)' è leggermente più conciso di '.filter (o -> o instanceof ThisClassIKnowRightNow)'. – antak