2013-10-29 4 views
5

Dato un Class<?> superType e Object subInstance, quali sono le differenze traClass # isinstance vs Class # isAssignableFrom

superType.isInstance(subInstance) 

e

superType.isAssignableFrom(subInstance.getClass()) 

(se del caso)?

+0

controllare il codice sorgente java –

+3

@Sunny Entrambi i metodi sono nativi. –

+0

oops !! non ci hai pensato –

risposta

2

isAssignableFrom verifica inoltre se il tipo può essere convertito tramite una conversione di identità o tramite una conversione di riferimento di ampliamento.

Class<?> cInt = Integer.TYPE; 

    Long l = new Long(123); 

    System.out.println(cInt.isInstance(l)); // false 
    System.out.println(cInt.isAssignableFrom(cInt)); // true 
+1

Il codice di esempio sembra dimostrare niente - 'cInt.isAssignableFrom (cInt)' è ovviamente vero, dal momento che sta testando se stesso. Questo non è un confronto con 'cInt.isInstance (l) ', perché' l' è Long, non 'Integer.TYPE'. – Nicole

0

isAssignableFrom() sarà vera ogniqualvolta la classe rappresentata dall'oggetto classe è una superclasse o superinterfaccia di subInstance.getClass()

isInstance() sarà vero quando l'oggetto subInstance è un'istanza di superType.

Quindi la differenza fondamentale è che isInstance funziona con le istanze isAssignableFrom funziona con le classi.

Io uso spesso isAssignableFrom se non ho un'istanza/non voglio istanziare la classe per qualche motivo. Altrimenti puoi usare entrambi.

1

Nello scenario, non vi è alcuna differenza.

La differenza tra entrambi i metodi sono i parametri. Si lavora con l'oggetto e uno con le classi:

Class#isInstance(Object)

Determina se l'oggetto Object specificato è assegnazione compatibile con l'oggetto rappresentato da questa classe.

Class#isAssignableFrom(Class)

Determina se la classe o interfaccia rappresentata dall'oggetto classe è o uguale, o è una superclasse o superinterfaccia di, la classe o interfaccia rappresentato dal specificata Classe parametro.

0

Dal Java API:

isInstance(Object obj) 
Determines if the specified Object is assignment-compatible with the object represented by this Class. 

isAssignableFrom(Class<?> cls) 
Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter. 

Così suona come i due metodi fanno cose molto simili, ma si prende un Object e guarda alla Class di tale oggetto, mentre l'altro prende un Class .