Soyons clazz
certains Class
et obj
soyez certains Object
.
Est
clazz.isAssignableFrom(obj.getClass())
toujours le même que
clazz.isInstance(obj)
?
Sinon, quelles sont les différences?
NullPointerException
if obj == null
.
Soyons clazz
certains Class
et obj
soyez certains Object
.
Est
clazz.isAssignableFrom(obj.getClass())
toujours le même que
clazz.isInstance(obj)
?
Sinon, quelles sont les différences?
NullPointerException
if obj == null
.
Réponses:
clazz.isAssignableFrom(Foo.class)
sera vrai chaque fois que la classe représentée par l' clazz
objet est une superclasse ou une superinterface de Foo
.
clazz.isInstance(obj)
sera vrai chaque fois que l'objet obj
est une instance de la classe clazz
.
C'est:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
est toujours vrai tant clazz
et ne obj
sont pas nuls.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b));
-> c'est vrai aussi pour les interfaces.
obj
c'est null
alors clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
jettera un NullPointerException
et 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 MyClass
sans augmenter a ClassCastException
. En d'autres termes, obj est une instance de MyClass
ou de ses sous-classes.
MyClass.class.isAssignableFrom(Other.class)
retourne vrai si MyClass
est le même que, ou une superclasse ou superinterface de, Other
. Other
peut être une classe ou une interface. Il répond vrai si Other
peut ê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 NullPointerException
si 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, isInstance
mais uniquement de l' Class
objet à utiliser isAssignableFrom
.
Comparable.class.isAssignableFrom(Byte.class) == true
mais 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 Class
objet 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.
Byte
vous découvrirez qu'il s'étend Number
et est une classe. (byte) 1
n'est pas équivalent à Byte
. Le premier est un primitif. Ce dernier est une classe.
byte
en Byte
car le type de paramètre isInstance
est Object
.
Par souci de concision, nous pouvons comprendre ces deux API comme ci-dessous:
X.class.isAssignableFrom(Y.class)
Si X
et Y
sont la même classe, ou X
est Y
la super classe ou la super interface, retournez true, sinon, false.
X.class.isInstance(y)
Say y
est une instance de classe Y
, si X
et Y
sont la même classe, ou X
est Y
la super classe ou la super interface de, renvoie true, sinon, false.