Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как проверить тип объекта

Короткий ответ

instanceof с именем переменной проверяет тип и сразу приводит объект к нему:

void main() {
    Object value = "hello";
 
    if (value instanceof String text) {
        IO.println(text.length());
    }
}

Результат:

5

Несколько типов

switch с шаблонами выбирает ветку по типу:

String describe(Object value) {
    return switch (value) {
        case Integer i when i < 0 -> "negative int " + i;
        case Integer i -> "int " + i;
        case String s -> "string of length " + s.length();
        case null -> "null";
        default -> "something else: " + value.getClass().getSimpleName();
    };
}
 
void main() {
    IO.println(describe(42));
    IO.println(describe(-1));
    IO.println(describe("abc"));
    IO.println(describe(3.14));
    IO.println(describe(null));
}

Результат:

int 42
negative int -1
string of length 3
something else: Double
null

Точный класс

instanceof учитывает наследование, а getClass() даёт точный класс объекта:

void main() {
    Object number = 5;
 
    IO.println(number instanceof Number);
    IO.println(number.getClass() == Number.class);
    IO.println(number.getClass().getName());
}

Результат:

true
false
java.lang.Integer

Частая ошибка

Приводить тип без проверки. Если объект другого типа, будет исключение:

void main() {
    Object value = 42;
    String text = (String) value;
}

Результат:

Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')

Если вы часто проверяете типы, подумайте о полиморфизме: общий метод в интерфейсе, который каждый класс реализует по-своему.

Функции из этого ответа

  • instanceof — Проверяет, является ли объект экземпляром типа, и сразу даёт переменную этого типа.
  • switch — Выбирает ветку по значению; в форме выражения возвращает результат.
  • Object.getClass() — Возвращает класс объекта во время выполнения.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.