Когда надо использовать instanceof в Java?

378
27 января 2017, 05:20

Не могу понять зачем нужно это ключевое слово. Объясните на примере, пожалуйста.

Допустим, у меня есть метод, в который можно передать объект любого типа.

void foo(Object o){
//?
}

И я хочу проверить к какому типу относится объект. Наверное, я не правильно понял суть instanceof. Но, все же напишу как считаю

if(o instanceof Integer){
//Your logic
}

Если понял правильно, то объясните, можно ли воспользоваться instanceof для развлетвения switch/case?

Также если понял верно, объясните пожалуйста, зачем он нужен, если можно создать несколько методов для разной логики?

Answer 1

Всё просто: o instanceof Integer просто проверяет, является ли реальный тип объекта o типом Integer.

Вы и правда можете создать несколько методов для вашей логики, один для Integer, другой для String. Но если к вам приходит Object, вы не сможете вызвать нужный метод, потому что не знаете, какого реально типа ваш объект. Вот для того, чтобы это выяснить, и нужен instanceof.

Кстати, использовать конструкцию switch с instanceof не выйдет, switch требует примитивные типы или String*. Но вы можете написать цепочку if'ов:

if (x instanceof Integer) {
    // что-то сделать с (Integer)x
} else if (x instanceof String) {
    // что-то сделать с (String)x
} else {
    // ну не шмагла я определить тип
}

В правильной, хорошо написанной программе, количество instanceof и подобых конструкций обычно невелико: имеет смысл избегать передачи нетипизированных объектов (например, параметров типа Object), а там, где код должен работать с параметрами различного типа, использовать дженерики. Однако иногда приходится пользоваться подходом с instanceof, например, при взаимодействии с API, которое было написано ещё до прихода дженериков.

Ещё по теме:

  • Расширение и сужение типов.
  • Причины использования DownCast

*Или enum, или врапперы на примитивные типы наподобие Character.

READ ALSO
как сделать блок div , как img-responsive?

как сделать блок div , как img-responsive?

Подскажите пожалуйста, КАК можно сделать блок div, чтоб у него были свойства как у img class="img-responsive"

367
Результат onsubmit формы в новом окне

Результат onsubmit формы в новом окне

Есть форма с инпутами

357
Как работает onmouseover в html тэгах?

Как работает onmouseover в html тэгах?

Делаю статическую страницу ошибки, вставляю в текст ссылку :

553
Неправильная работа float в IE11

Неправильная работа float в IE11

Есть сайтhttp://audi-a6

313