Для чего нужно ключевое слово instanceof в Java?

Ответ

Ключевое слово instanceof в Java используется для проверки, является ли объект экземпляром определенного класса или интерфейса. Возвращает true, если объект принадлежит указанному типу, иначе false.

Пример:

Object obj = "Hello";
if (obj instanceof String) {
    System.out.println("obj is a String");
}

Нюансы:

  • Работает с наследованием: если объект — подкласс, проверка вернет true.
  • Нельзя использовать с примитивами.
  • В Java 16+ можно использовать в сочетании с паттерн-матчингом:
if (obj instanceof String s) {
    System.out.println(s.length());
}

Ответ 18+ 🔞

А, ну вот, опять этот instanceof всплыл! Слушай, это же классика, как водка с огурцом. Вроде простая штука, а сколько подводных камней, ёпта.

Представь, у тебя есть какой-то объект, и ты такой: «А ты кто, блядь, на самом деле? Ты строка, ты список, ты мой сосед Петрович?» Вот instanceof — это как паспортный контроль для объектов. Подносишь его к объекту, спрашиваешь: «Ты случаем не String?» И он тебе честно: true или false. Никакого подвоха, на первый взгляд.

Вот смотри, как это просто выглядит:

Object obj = "Hello";
if (obj instanceof String) {
    System.out.println("obj is a String");
}

Видишь? Взяли Object (это как «неопознанный летающий объект» в джаве), запихнули туда строку. А потом спрашиваем: «Мужик, ты точно строка?» И если он говорит «да», то мы уже можем спать спокойно и работать с ним как со строкой. Без этой проверки компилятор тебе мозги выест, будет орать: «Э, сабака сука, Object не умеет в toLowerCase()!».

Но тут, конечно, есть свои нюансы, ядрёна вошь:

  • Наследование. Это самое главное. Если твой объект — это сын, внук или правнук того класса, который ты спрашиваешь, instanceof тоже скажет true. Спросил ты «ты Animal?», а тебе и кошка, и собака, и хомяк ответят «ага». Логично же, они все животные. Это не баг, это фича.
  • С примитивами не работает. Нельзя спросить у int — «а ты случаем не Integer?». Компилятор сразу тебя пошлёт нахуй с таким вопросом. Сначала оберни в класс-обёртку, потом спрашивай.
  • А вот это — самое вкусное, с Java 16+. Раньше ты делал проверку, а потом ещё и кастовал объект вручную. Словно проверил паспорт, а потом ещё отдельно просишь: «Ну теперь давай, перейди в кабинет и стань строкой». Теперь можно всё в одну строку, красота! Это называется паттерн-матчинг.
if (obj instanceof String s) {
    System.out.println(s.length());
}

Видишь магию? Проверили instanceof и сразу объявили новую переменную s типа String. Если проверка прошла, то s — это уже наш кастованный объект, и можно сразу вызывать s.length(). Удобно, ёбать колотить! Раньше бы писали String str = (String) obj;. Теперь — раз, и готово. Экономия времени и нервов, терпения-то ноль ебать.

Короче, instanceof — это твой верный друг, когда в коде летают объекты непонятного происхождения. Главное — используй с умом, а не тыкай его везде, куда попало, как мартышлюшка с гранатой.