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)?
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)?
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
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
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.
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:
Determina se l'oggetto Object specificato è assegnazione compatibile con l'oggetto rappresentato da questa classe.
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.
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
.
controllare il codice sorgente java –
@Sunny Entrambi i metodi sono nativi. –
oops !! non ci hai pensato –