Оператор 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, используемым для сравнения типов.