Позвольте clazzбыть некоторыми Classи objбыть некоторыми Object.
Является
clazz.isAssignableFrom(obj.getClass())
всегда так же, как
clazz.isInstance(obj)
?
Если нет, в чем различия?
NullPointerExceptionесли obj == null.
Позвольте clazzбыть некоторыми Classи objбыть некоторыми Object.
Является
clazz.isAssignableFrom(obj.getClass())
всегда так же, как
clazz.isInstance(obj)
?
Если нет, в чем различия?
NullPointerExceptionесли obj == null.
Ответы:
clazz.isAssignableFrom(Foo.class)будет истинным, когда класс, представленный clazzобъектом, является суперклассом или суперинтерфейсом Foo.
clazz.isInstance(obj)будет истинным всякий раз, когда объект objявляется экземпляром класса clazz.
То есть:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
всегда верно, пока clazzи не objравны нулю.
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> Это верно и для интерфейсов.
objесть, nullто clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)брошу NullPointerExceptionи не вернусь true.
Оба ответа находятся в поле зрения, но ни один не является полным ответом.
MyClass.class.isInstance(obj)для проверки экземпляра. Он возвращает true, когда параметр obj не равен NULL и может быть приведен к MyClassбез повышения a 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();
}
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)? Я растерялся из-за выхода :)
isAssignableFrom()бросает a, NullPointerExceptionесли объект нулевой, тогда как isInstance()просто возвращает false. Это настоящий ответ.
Я думаю, что результат для этих двух всегда должен быть одинаковым. Разница в том, что вам нужен экземпляр класса для использования, isInstanceа только Classобъект для использования isAssignableFrom.
Comparable.class.isAssignableFrom(Byte.class) == trueно Byte.class.isInstance(Comparable.class) == false. Другими словами, isInstance()не является симметричным для интерфейсов, только для подклассов.
Byte.class.isInstance(Comparable.class)ложно, потому что Classобъект не является экземпляром Byte. Правильное сравнение Comparable.class.isAssignableFrom(Byte.class)IS Comparable.class.isInstance((byte) 1), что это правда.
Byteвы обнаружите, что он расширяется Numberи является классом. (byte) 1не является эквивалентом Byte. Первый примитив. Последний класс.
byteк , Byteтак как тип параметра isInstanceявляется Object.
Для краткости мы можем понять эти два API, как показано ниже:
X.class.isAssignableFrom(Y.class)Если Xи Yявляются одним и тем же классом, или Xявляется Yсуперклассом или суперинтерфейсом, вернуть true, иначе false.
X.class.isInstance(y)Say yявляется экземпляром класса Y, если Xи Yявляется одним и тем же классом, или Xявляется Yсуперклассом или суперинтерфейсом, возвращает true, в противном случае - false.