Java використання оператора instanceof з інтерфейсом

a.k.a. Особливості використання оператора instanceof для перевірки реалізації об'єктом інтерфейсу в мові Java. Адже, напевно, комусь довгі заголовки подобаються більше. )

Виявив один цікавий момент, що стосується реалізації оператора instanceof в Java, про який рідко де згадують.

Всі ми знаємо, що спроби використання в операторі instanceof типів, що не входять в одну ієрархію спадкування, різко присікаються компілятором. Так, наприклад, наступний код:

приведе до помилки компіляції:

Але, виявляється, так буває не завжди. Давайте замінимо клас в правій частині оператора instanceof будь-яким інтерфейсом:

Як не дивно, в цьому випадку компіляція проходить цілком успішно! І, до речі, скомпільована програма виконується взагалі без будь-яких проблем і виводить результат "false" в консоль.

Постарайтеся не поспішати з висновками, так як якщо ми перепишемо наш приклад наступним чином:

то це знову призведе до помилки компіляції! Тобто практично тієї ж самої, що і в першому випадку:

Забавно, чи не так?

Насправді, вся справа в тому, що String - це фінальний клас, на відміну від нашого класу Class1. У разі, якщо клас оголошений з модифікатором final, компілятору вдається визначити, чи реалізує клас будь-якої інтерфейс чи ні. У всіх інших випадках компілятор зробити це не в змозі, тому що інтерфейс може реалізовувати один з нащадків даного класу. Так, не дуже переконливе виправдання, на мій погляд, але, тим не менш, "таке життя, синку".

Думаю, знання про подібну поведінку оператора instanceof знадобиться програмістам, які готуються до проходження Java-сертифікації. Якраз-таки використання оператора instanceof з інтерфейсом було предметом одного з каверзних питань, зустрінутих мною під час підготовки до OCPJP.

Схожі статті