260 votes

java: Class.isInstance vs Class.isAssignableFrom

Laissez certains et y .

Est

toujours les mêmes que

?

Si non, quelles sont les différences ?

251voto

uckelman Points 7228

aura la valeur true si la classe représentée par le objet est une superclasse ou superinterface de `` .

aura la valeur true lorsque l’objet est une instance de la classe `` .

C'est :

n’est-ce toujours vrai.

207voto

Paul Points 7124

Les deux réponses sont dans le stade, mais ce n'est une réponse complète.

MyClass.class.isInstance(obj) est pour vérifier une instance. Elle renvoie vrai si le paramètre obj est non nulle, et peut être jeté à l' MyClass sans soulever un ClassCastException. En d'autres termes, obj est une instance de l' MyClass ou de ses sous-classes.

MyClass.class.isAssignableFrom(Other.class) retournera true si MyClass est le même, ou d'une super-classe ou superinterface de, Other. Other peut être une classe ou une interface. Il répond vrai si Other peut être converti en MyClass.

Un peu de code pour illustrer:

public class NewMain
{
    public static void main(String[] args)
    {
        NewMain nm = new NewMain();
        nm.doit();
    }

    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));
        System.out.println("b isInstance a: " + A.class.isInstance(myB));
        System.out.println("a isInstance b: " + B.class.isInstance(myA));
        System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class));
        System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class));
        System.out.println("bArr isInstance A: " + A.class.isInstance(bArr));
        System.out.println("bArr isInstance aArr: " + aArr.getClass().isInstance(bArr));
        System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass()));
    }

    class A
    {
    }

    class B extends A
    {
    }
}

Et la sortie:

b instanceof a: true
b isInstance a: true
a isInstance b: false
b isAssignableFrom a: true
a isAssignableFrom b: false
bArr isInstance A: false
bArr isInstance aArr: true
bArr isAssignableFrom aArr: true

9voto

ColinD Points 48573

Je pense que le résultat de ces deux devrait toujours être le même. La différence est que vous avez besoin d’une instance de la classe à utiliser mais juste le objet à utiliser `` .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X