Дозвольте clazzбути деякими Classі objбути деякими Object.
Є
clazz.isAssignableFrom(obj.getClass())
завжди те саме, що
clazz.isInstance(obj)
?
Якщо ні, то які відмінності?
NullPointerExceptionif obj == null.
Дозвольте clazzбути деякими Classі objбути деякими Object.
Є
clazz.isAssignableFrom(obj.getClass())
завжди те саме, що
clazz.isInstance(obj)
?
Якщо ні, то які відмінності?
NullPointerExceptionif 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)призначений для перевірки екземпляра. Він повертає істину, коли параметр obj не є нульовим і може бути переданий до MyClassбез підвищення a ClassCastException. Іншими словами, obj - це екземпляр MyClassабо його підкласи.
MyClass.class.isAssignableFrom(Other.class)повертає істину , якщо 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)Скажімо y, це екземпляр класу Y, якщо Xі Yтой самий клас, або XєY «s супер клас або супер інтерфейс, повертає істину, в іншому випадку, брехня.