Пусть clazz будет некоторым Class и obj быть некоторым Object.
Есть
clazz.isAssignableFrom(obj.getClass())
всегда совпадает с
clazz.isInstance(obj)
?
Если нет, каковы различия?
Пусть clazz будет некоторым Class и obj быть некоторым Object.
Есть
clazz.isAssignableFrom(obj.getClass())
всегда совпадает с
clazz.isInstance(obj)
?
Если нет, каковы различия?
clazz.isAssignableFrom(Foo.class) будет истинным всякий раз, когда класс, представленный объектом clazz, является суперклассом или суперинтерфейсом Foo.
clazz.isInstance(obj) будет истинным всякий раз, когда объект obj является экземпляром класса clazz.
То есть:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
всегда истинно.
Оба ответа находятся в шаге, но ни один из них не является полным ответом.
MyClass.class.isInstance(obj) предназначен для проверки экземпляра. Он возвращает true, если параметр obj не равен нулю и может быть отброшен до MyClass без повышения a ClassCastException. Другими словами, obj является экземпляром MyClass или его подклассов.
MyClass.class.isAssignableFrom(Other.class) вернет true, если MyClass совпадает с суперклассом или суперинтерфейсом, Other. Other может быть классом или интерфейсом. Он отвечает true, если 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, как показано ниже:
Если X и Y являются одним и тем же классом, или X является супер-классом Y или супер-интерфейсом, верните true, иначе false.
Скажите, что y - это экземпляр класса Y, если X и Y являются одним и тем же классом, или X является супер-классом Y или супер-интерфейсом, верните true, в противном случае false.