Оператор Java instanceof

Оператор instanceof Java(также называемый оператором сравнения типов) используется для проверки того, является ли указанный объект экземпляром указанного типа(класса, подкласса или интерфейса).

Экземпляр возвращает –

  • true – если переменная является экземпляром указанного класса, его родительского класса или реализует указанный интерфейс или его родительский интерфейс
  • false – если переменная не является экземпляром класса или не реализует интерфейс, или переменная имеет значение null.
HashMap map = new HashMap();assertTrue( map instanceof Map );assertTrue( map instanceof AbstractMap );assertFalse( map instanceof List );map = null;assertFalse( map instanceof Map );

1. Синтаксис оператора instanceof

Оператор instanceof проверяет переменные на соответствие указанному типу. Переменная записывается с левой стороны оператора, а тип указывается с правой стороны оператора.

boolean value = variable instanceof ClassType;//orif(variable instanceof ClassType) {//perform some action}

2. Оператор instanceof не требует явной проверки на null.

В Java null — это тип, поэтому нам не нужно проверять NullPointerException при использовании оператора instanceof. Экземпляр instanceof делает это внутренне за нас.

if(map != null && map instanceof Map) {//some action}

В предыдущем примере нам не нужно делать явную проверку на null. Правильный способ записи выражения:

if(map instanceof Map) { //null check is implicit//some action}

3. Использование instanceof с массивом

В Java массивы также считаются объектами и имеют связанные с ними поля и методы. Поэтому мы можем использовать оператор instanceof и с массивами.

Примитивные массивы являются экземплярами Object и имеют собственный тип. Например, int[] имеет тип Object и int[]. Оба сравнения возвращают значение true.

int[] intArr = new int[0];Assertions.assertTrue(intArr instanceof Object);Assertions.assertTrue(intArr instanceof int[]);

Массивы объектов имеют типы Object, Object[], classtype array и parent class type array. Например, Integer[] имеет тип Object, Object[], Integer[] и Number[](Integer расширяет Number).

Integer[] integerArr = new Integer[0];Assertions.assertTrue(integerArr instanceof Object);Assertions.assertTrue(integerArr instanceof Object[]);Assertions.assertTrue(integerArr instanceof Integer[]);Assertions.assertTrue(integerArr instanceof Number[]);

4. Когда использовать?

Примером из реальной жизни использования оператора instanceof может быть приведение типа переменной к другому типу. Оператор instanceof помогает избежать ClassCastException во время выполнения.

Рассмотрим следующий пример, где мы пытаемся привести список к классу LinkedList, где исходная переменная имеет тип ArrayList. Это вызовет исключение ClassCastException.

 Список<Строка> список = новый ArrayList<>();LinkedList<Строка> linkedList =(LinkedList) список; //ClassCastException

Для корректного приведения переменной можно использовать оператор instanceof. Это не приведет к ClassCastException.

List<String> list = new ArrayList<>();if(list instanceof LinkedList) {LinkedList<String> linkedList =(LinkedList) list;//other actions} else if(list instanceof ArrayList) {ArrayList<String> arrayList =(ArrayList) list;//other actions}

Начиная с Java 14, оператор instanceof поддерживает сопоставление с образцом. Мы можем переписать приведенное выше выражение более кратко:

List<String> list = new ArrayList<>();if(list instanceof LinkedList linkedList) {//use linkedlist variable here} else if(list instanceof ArrayList arrayList) {//use arraylist variable here}

Напишите мне ваши вопросы, связанные с оператором instanceof, используемым для сравнения типов.

Исходный код на Github

Прокрутить вверх