класс Java.isInstance vs Class.isAssignableFrom



пусть clazz быть Class и obj быть Object.



и



clazz.isAssignableFrom(obj.getClass())


на



clazz.isInstance(obj)


?



если нет, то в чем разница?

317   4  

4 ответов:

clazz.isAssignableFrom(Foo.class) будет true всякий раз, когда класс, представленный clazz объект является суперклассом или суперинтерфейсом Foo.

clazz.isInstance(obj) будет истинно всякий раз, когда объект obj является экземпляром класса clazz.

что есть:

clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)

всегда верно, пока clazz и obj непустые.

оба ответа находятся в поле зрения, но ни один из них не является полным ответом.

MyClass.class.isInstance(obj) предназначен для проверки экземпляра. Он возвращает true, когда параметр obj не равен null и может быть приведен к MyClass без ClassCastException. Другими словами, obj является экземпляром MyClass или его подклассов.

MyClass.class.isAssignableFrom(Other.class) возвращает true, если MyClass это то же самое, что или суперкласс или суперинтерфейс,Other. Other может быть класс или интерфейс. Он отвечает верно, если Other может быть преобразован в MyClass.

немного кода для демонстрации:

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
    {
    }
}

и вывод:

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

Я думаю, что результат для этих двух всегда должен быть одинаковым. Разница в том, что вам нужен экземпляр класса, чтобы использовать isInstance только Class объект, чтобы использовать isAssignableFrom.

для краткости, мы можем понять эти два API, как показано ниже:

  1. X.class.isAssignableFrom(Y.class)

Если X и Y-один и тот же класс, или X-суперкласс Y или суперинтерфейс, верните true, в противном случае false.

  1. X.class.isInstance (y):

скажем, y является экземпляром класса Y, если X и Y являются одним и тем же классом, или X является суперклассом Y или суперинтерфейсом, возвращает true, в противном случае false.

Comments

    Ничего не найдено.