Разница между instanceof и isAssignableFrom в Java

На первый взгляд instanceof и Class.isAssignableFrom в Java делают одно и то же. Я уже описывал действие instanceof в своём учебнике, здесь мы заострим внимание на его отличии от Class.isAssignableFrom, который я ещё не рассматривал и не описывал. Оба метода позволяют проверить, является ли переменная экземпляром объекта указанного типа или экземпляром дочернего типа к указанному. Но на самом деле есть три существенные разницы.

Пусть у нас есть следующая структура классов:

Объявим две переменные:

С помощью instanceof мы можем проверить, является ли переменная b экземпляром нужного нам типа или дочерним типом к нужному нам:

То же самое мы можем сделать и с помощью метода Class.isAssignableFrom, но нам нужно будет поменять местами правую и левую части:

Так вот. Первое отличие instanceof и Class.isAssignableFrom в Java заключается в том, что у них меняются местами левые и правые части.

Есть ещё одно важное отличие. Посмотрите на этот код, он не компилируется:

Для instanceof тип класса, на принадлежность которому мы проверяем, должен быть известен на этапе компиляции.

Но мы можем сделать это с помощью Class.isAssignableFrom:

С помощью Class.isAssignableFrom мы можем проверить принадлежность типу или его потомку даже в том случае, когда тип, на принадлежность которому мы проверяем, на этапе компиляции неизвестен.

Если в левой части instanceof стоит null, то результат будет false:

Однако мы не можем осуществить подобную проверку с помощью Class.isAssignableFrom:

Запомните! Для null-значений в левой части instanceof возвращает false, но Class.isAssignableFrom для null-значений в правой части вернёт NullPointerException.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *