Lass clazzeinige sein Classund objeinige sein Object.
Ist
clazz.isAssignableFrom(obj.getClass())
immer das gleiche wie
clazz.isInstance(obj)
?
Wenn nicht, was sind die Unterschiede?
NullPointerExceptionWenn werfen obj == null.
Lass clazzeinige sein Classund objeinige sein Object.
Ist
clazz.isAssignableFrom(obj.getClass())
immer das gleiche wie
clazz.isInstance(obj)
?
Wenn nicht, was sind die Unterschiede?
NullPointerExceptionWenn werfen obj == null.
Antworten:
clazz.isAssignableFrom(Foo.class)wird immer dann wahr sein, wenn die durch das clazzObjekt dargestellte Klasse eine Superklasse oder Superschnittstelle von ist Foo.
clazz.isInstance(obj)wird wahr sein, wenn das Objekt objeine Instanz der Klasse ist clazz.
Das ist:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
ist immer wahr, solange clazzund objnicht null.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> das gilt auch für schnittstellen.
objist nulldann clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)wird ein werfen NullPointerExceptionund nicht zurückkehren true.
Beide Antworten befinden sich im Ballpark, aber keine ist eine vollständige Antwort.
MyClass.class.isInstance(obj)dient zum Überprüfen einer Instanz. Es gibt true zurück, wenn der Parameter obj nicht null ist und MyClassohne Erhöhen von a umgewandelt werden kann ClassCastException. Mit anderen Worten, obj ist eine Instanz MyClassoder deren Unterklassen.
MyClass.class.isAssignableFrom(Other.class)wird true zurückgeben, wenn MyClasses dasselbe ist wie oder eine Superklasse oder Superschnittstelle von , Other. Otherkann eine Klasse oder eine Schnittstelle sein. Es antwortet wahr, wenn Otherin a konvertiert werden kann MyClass.
Ein kleiner Code zur Demonstration:
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)? Ich verwirrt durch Ausgabe :)
isAssignableFrom()wirft ein , NullPointerExceptionwenn das Objekt null ist, während isInstance()nur false zurückgibt. Das ist die wahre Antwort.
Ich denke, das Ergebnis für diese beiden sollte immer das gleiche sein. Der Unterschied besteht darin, dass Sie eine Instanz der Klasse benötigen, isInstanceaber nur das Classzu verwendende Objekt isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == trueaber Byte.class.isInstance(Comparable.class) == false. Mit anderen Worten, isInstance()ist nicht symmetrisch für Schnittstellen, sondern nur für Unterklassen.
Byte.class.isInstance(Comparable.class)ist falsch, weil ein ClassObjekt keine Instanz von ist Byte. Der richtige Vergleich zu Comparable.class.isAssignableFrom(Byte.class)ist Comparable.class.isInstance((byte) 1), was wahr ist.
ByteSie feststellen, dass er sich ausdehnt Numberund eine Klasse ist. (byte) 1ist nicht gleichbedeutend mit Byte. Ersteres ist ein Primitiv. Letzteres ist eine Klasse.
byte, Byteweil der Parametertyp von isInstanceist Object.
Der Kürze halber können wir diese beiden APIs wie folgt verstehen:
X.class.isAssignableFrom(Y.class)Wenn Xund Yderselben Klasse sind, oder Xist Y‚s Superklasse oder Superschnittstelle, return true, andernfalls false.
X.class.isInstance(y)Say yist eine Instanz der Klasse Y, wenn Xund Yderselben Klasse sind, oder Xist Y‚s Superklasse oder Superschnittstelle, true zurück, andernfalls false.