Lasciate clazzessere qualcheClass ed objessere alcuni Object.
È
clazz.isAssignableFrom(obj.getClass())
sempre uguale a
clazz.isInstance(obj)
?
In caso contrario, quali sono le differenze?
NullPointerExceptionif obj == null.
Lasciate clazzessere qualcheClass ed objessere alcuni Object.
È
clazz.isAssignableFrom(obj.getClass())
sempre uguale a
clazz.isInstance(obj)
?
In caso contrario, quali sono le differenze?
NullPointerExceptionif obj == null.
Risposte:
clazz.isAssignableFrom(Foo.class)sarà vero ogni volta che la classe rappresentata clazzdall'oggetto è una superclasse o superinterfaccia diFoo .
clazz.isInstance(obj)sarà vero ogni volta che l'oggetto objè un'istanza della classe clazz.
Questo è:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
è sempre vero fintanto che clazze non objsono null.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> è vero anche per le interfacce.
objè nullallora clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)lancerà un NullPointerExceptione non tornerà true.
Entrambe le risposte sono nel campo da baseball ma nessuna delle due è una risposta completa.
MyClass.class.isInstance(obj)serve per controllare un'istanza. Restituisce vero quando il parametro obj è non nullo e può essere lanciato MyClasssenza alzare a ClassCastException. In altre parole, obj è un esempio diMyClass o delle sue sottoclassi.
MyClass.class.isAssignableFrom(Other.class)restituisce vero se MyClassè la stessa, o una superclasse o superinterfaccia di, Other. Otherpuò essere una classe o un'interfaccia. Risponde vero se Otherpuò essere convertito in a MyClass.
Un piccolo codice per dimostrare:
public class NewMain
{
public static void main(String[] args)
{
NewMain nm = new NewMain();
nm.doit();
}
class A { }
class B extends A { }
public void doit()
{
A myA = new A();
B myB = new B();
A[] aArr = new A[0];
B[] bArr = new B[0];
System.out.println("b instanceof a: " + (myB instanceof A)); // true
System.out.println("b isInstance a: " + A.class.isInstance(myB)); //true
System.out.println("a isInstance b: " + B.class.isInstance(myA)); //false
System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class)); //true
System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class)); //false
System.out.println("bArr isInstance A: " + A.class.isInstance(bArr)); //false
System.out.println("bArr isInstance aArr: " + aArr.getClass().isInstance(bArr)); //true
System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass())); //true
}
}
A.class.isAssignableFrom(B.class)? Ho confuso dall'output :)
isAssignableFrom()genera un NullPointerExceptionse l'oggetto è null, mentre isInstance()restituisce semplicemente false. Questa è la vera risposta.
Penso che il risultato per quei due dovrebbe essere sempre lo stesso. La differenza è che hai bisogno di un'istanza della classe da usare isInstancema solo l' Classoggetto da usare isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == truema Byte.class.isInstance(Comparable.class) == false. In altre parole, isInstance()non è simmetrico per le interfacce, ma solo per le sottoclassi.
Byte.class.isInstance(Comparable.class)è falso perché un Classoggetto non è un'istanza di Byte. Il confronto corretto con Comparable.class.isAssignableFrom(Byte.class)è Comparable.class.isInstance((byte) 1), che è vero.
Bytescoprirai che si estende Numbered è una classe. (byte) 1non è equivalente a Byte. Il primo è un primitivo. Quest'ultima è una classe.
bytea Bytecausa del tipo di parametro di isInstanceè Object.
Per brevità, possiamo comprendere queste due API come di seguito:
X.class.isAssignableFrom(Y.class)Se X e Ysono la stessa classe o Xè Yla super classe o la super interfaccia, restituisce true, altrimenti false.
X.class.isInstance(y)Say yè un'istanza di classe Y, se XeY sono la stessa classe, oppure Xè Ysuperclasse o super interfaccia, restituisce vero, altrimenti falso.