Как проверить тип объекта
Короткий ответ
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() — Возвращает класс объекта во время выполнения.