Проверки типов в Java
Дорогу осилит идущийВАЖНО: ниже находится устаревшая версия статьи. Актуальную можно найти здесь: ссылка.
При разборе наследования мы сталкивались с даункастингом. И те, кто делал практику, обратили внимание, как неудобно было реализовывать проверки для него. Java имеет как минимум два механизма, упрощающие подобную логику. О них мы и поговорим сегодня.
Ключевое слово instanceof
Первый из способов представлен отдельным оператором. Для первого знакомства с ним предлагаю изучить статью: https://metanit.com/java/tutorial/3.10.php
Часть информации из нее мы уже знаем, оставшаяся как раз посвящена instanceof.
Отметим несколько важных моментов:
- По-настоящему удобным синтаксис instanceof стал лишь в Java 16, до этого было необходимо реализовывать проверку на тип и после делать явный каст к типу. Теперь это не обязательно;
- instanceof НЕ гарантирует, что проверяемый объект принадлежит к нужному классу. Он проверяет лишь то, что нужный класс есть в иерархии проверяемого объекта. Т.е. sthObj instanceof Object будет true для любого объекта, вне зависимости от его настоящего типа.
В большинстве случаев, функциональности instanceof достаточно. Если же нам нужна большая точность — стоит использовать способ из следующего подраздела.
Методы Object: getClass()
Следующий урок будет полностью посвящен классу Object и его методам. Однако один из них мы разберем сегодня.
Метод getClass() возвращает объект типа Class, соответствующий классу, которому принадлежит изначальный объект.
Class — класс, описывающий класс (тип данных) как сущность. Через него можно получить доступ к информации о названии, полях, методах и другим данным о классе, которому принадлежит объект.
Объект класса Class можно получить двумя способами: первый — через метод getClass() у объекта — мы уже увидели, второй относится к функциональности класса (как типа данных).
Мы знаем, что у классов могут быть статические поля и методы. Обращение к ним можно описать как <ClassName>.<fieldName>/<methodName>().
Но кроме этого у каждого класса есть «литерал класса», который предоставляет объект класса Class. Обращение к этому литералу очень похоже на обращение к статическому полю (хоть им и не является):
SthClass.class
На основании этого, мы можем сравнить настоящий тип конкретного объекта с интересующим нас классом следующим образом:
SthClass sthClass = new SthClass();
sthClass.getClass().equals(SthClass.class); //true
С методом equals() мы уже неоднократно встречались, используя его можно сравнить любые объекты. В т.ч. и объекты типа Class.
Несмотря на обилие новой информации, тема достаточно простая, на данном этапе она лишь предлагает два способа получения информации о принадлежности объекта определенному типу данных (классу). Оба способа можно использовать как обычное условное выражение, в том числе проверять в if() и пр.
С теорией на сегодня все!

Переходим к практике:
Задача:
Реализовать задачу https://github.com/KFalcon2022/practical-tasks/tree/master/src/com/walking/lesson13_inheritance/task2
используя изученные способы проверки типа.
Вариант 1: используйте instanceof;
Вариант 2: используйте getClass().
Какой из способов больше подходит для данной задачи? Почему?
Если что-то непонятно или не получается – welcome в комменты к посту или в лс:)
Канал: https://t.me/+relA0-qlUYAxZjI6
Мой тг: https://t.me/ironicMotherfucker
Дорогу осилит идущий!