Soyons clazzcertains Classet objsoyez certains Object.
Est
clazz.isAssignableFrom(obj.getClass())
toujours le même que
clazz.isInstance(obj)
?
Sinon, quelles sont les différences?
NullPointerExceptionif obj == null.
Soyons clazzcertains Classet objsoyez certains Object.
Est
clazz.isAssignableFrom(obj.getClass())
toujours le même que
clazz.isInstance(obj)
?
Sinon, quelles sont les différences?
NullPointerExceptionif obj == null.
Réponses:
clazz.isAssignableFrom(Foo.class)sera vrai chaque fois que la classe représentée par l' clazzobjet est une superclasse ou une superinterface de Foo.
clazz.isInstance(obj)sera vrai chaque fois que l'objet objest une instance de la classe clazz.
C'est:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
est toujours vrai tant clazzet ne objsont pas nuls.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> c'est vrai aussi pour les interfaces.
objc'est nullalors clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)jettera un NullPointerExceptionet ne reviendra pas true.
Les deux réponses sont dans la boule mais aucune n'est une réponse complète.
MyClass.class.isInstance(obj)sert à vérifier une instance. Il retourne vrai lorsque le paramètre obj est non nul et peut être converti en MyClasssans augmenter a ClassCastException. En d'autres termes, obj est une instance de MyClassou de ses sous-classes.
MyClass.class.isAssignableFrom(Other.class)retourne vrai si MyClassest le même que, ou une superclasse ou superinterface de, Other. Otherpeut être une classe ou une interface. Il répond vrai si Otherpeut être converti en a MyClass.
Un petit code pour démontrer:
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)? Je suis confus par la sortie :)
isAssignableFrom()lance un NullPointerExceptionsi l'objet est nul, tandis isInstance()que renvoie simplement faux. Voilà la vraie réponse.
Je pense que le résultat pour ces deux devrait toujours être le même. La différence est que vous avez besoin d'une instance de la classe à utiliser, isInstancemais uniquement de l' Classobjet à utiliser isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == truemais Byte.class.isInstance(Comparable.class) == false. En d'autres termes, isInstance()n'est pas symétrique pour les interfaces, uniquement pour les sous-classes.
Byte.class.isInstance(Comparable.class)est faux car un Classobjet n'est pas une instance de Byte. La comparaison correcte avec Comparable.class.isAssignableFrom(Byte.class)est Comparable.class.isInstance((byte) 1), ce qui est vrai.
Bytevous découvrirez qu'il s'étend Numberet est une classe. (byte) 1n'est pas équivalent à Byte. Le premier est un primitif. Ce dernier est une classe.
byteen Bytecar le type de paramètre isInstanceest Object.
Par souci de concision, nous pouvons comprendre ces deux API comme ci-dessous:
X.class.isAssignableFrom(Y.class)Si Xet Ysont la même classe, ou Xest Yla super classe ou la super interface, retournez true, sinon, false.
X.class.isInstance(y)Say yest une instance de classe Y, si Xet Ysont la même classe, ou Xest Yla super classe ou la super interface de, renvoie true, sinon, false.