java: Class.isInstance vs Class.isAssignableFrom

Пусть clazz – некоторый Class а obj – некоторый Object .

Является

 clazz.isAssignableFrom(obj.getClass()) 

всегда то же самое, что и

 clazz.isInstance(obj) 

?

Если нет, то каковы различия?

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

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

То есть:

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

всегда истинно, если clazz и obj являются ненулевыми.

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

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

MyClass.class.isAssignableFrom(Other.class) вернет true, если MyClass – это то же самое, что и суперclass или суперинтерфейс, Other . Other может быть class или интерфейс. Он отвечает 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 

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

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

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

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

  1. X.class.isInstance (у):

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

  • Java - Нулевая переменная требует пространства в памяти
  • Как прокрутить до нижней части RecyclerView? scrollToPosition не работает
  • java.lang.IllegalStateException: только непрозрачные действия в полноэкранном режиме могут запрашивать ориентацию
  • Как получить имя первого дня месяца?
  • Android-проект с использованием httpclient -> http.client (apache), метод post / get
  • Java BigDecimal.power (BigDecimal exponent): Есть ли библиотека Java, которая это делает?
  • String.format () для форматирования double в java
  • Java-коллекция пар ценностей? (кортежи?)
  • java.lang.ClassCastException
  • Интерфейсы со статическими полями в java для совместного использования 'констант'
  • Разбор JSON для JSON для JSON в JSONObject
  • Давайте будем гением компьютера.