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, как показано ниже:
- X.class.isAssignableFrom(Y.class)
Если X и Y-один и тот же класс, или X-суперкласс Y или суперинтерфейс, верните true, в противном случае false.
- X.class.isInstance (y):
скажем, y является экземпляром класса Y, если X и Y являются одним и тем же классом, или X является суперклассом Y или суперинтерфейсом, возвращает true, в противном случае false.
Comments