Екземпляр Java оператора

1. Вступ

У цьому короткому посібнику ми дізнаємося про оператор instanceof в Java.

2. Що таке екземпляр оператора?

instanceof - це двійковий оператор, який використовується для перевірки, чи є об'єкт даного типу. Результат операції є істинним, або хибним . Він також відомий як оператор порівняння типів, оскільки він порівнює екземпляр із типом.

Перш ніж кидати невідомий об'єкт, слід завжди використовувати екземпляр перевірки. Це допомагає уникнути ClassCastException під час виконання.

У InstanceOf базовий синтаксис оператора полягає в наступному :

(object) instanceof (type)

Давайте побачимо базовий приклад оператора instanceof . Спочатку давайте створимо клас Раунду :

public class Round { // implementation details }

Далі створимо клас Ring, що розширює Round :

public class Ring extends Round { // implementation details }

Ми можемо використовувати instanceof, щоб перевірити, чи екземпляр Ring має круглий тип:

@Test public void givenWhenInstanceIsCorrect_thenReturnTrue() { Ring ring = new Ring(); Assert.assertTrue(ring instanceof Round); }

3. Як працює екземпляр оператора?

Оператор instanceof працює за принципом відносини is-a . Концепція відносин is-a заснована на успадкуванні класу або реалізації інтерфейсу.

Щоб продемонструвати це, давайте створимо інтерфейс Shape :

public interface Shape { // implementation details }

Давайте також створимо клас Circle, який реалізує інтерфейс Shape, а також розширює клас Round :

public class Circle extends Round implements Shape { // implementation details }

Результат instanceof буде істинним, якщо об'єкт є екземпляром типу:

@Test public void givenWhenObjectIsInstanceOfType_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Circle); }

Це також буде вірно, якщо об’єкт є екземпляром підкласу типу:

@Test public void giveWhenInstanceIsOfSubtype_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Round); }

Якщо тип є інтерфейсом, він поверне true, якщо об'єкт реалізує інтерфейс:

@Test public void givenWhenTypeIsInterface_thenReturnTrue() { Circle circle = new Circle(); Assert.assertTrue(circle instanceof Shape); }

Оператор instanceof не може бути використаний, якщо між об'єктом, що порівнюється, і типом, з яким його порівнюють, немає зв'язку.

Давайте створимо новий трикутник класу, який реалізує Shape, але не має ніякого відношення до Circle :

public class Triangle implements Shape { // implementation details }

Тепер, якщо ми використовуємо instanceof, щоб перевірити, чи є коло екземпляром Triangle :

@Test public void givenWhenComparingClassInDiffHierarchy_thenCompilationError() { Circle circle = new Circle(); Assert.assertFalse(circle instanceof Triangle); }

Ми отримаємо помилку компіляції, оскільки між класами Circle та Triangle немає взаємозв'язку :

java.lang.Error: Unresolved compilation problem: Incompatible conditional operand types Circle and Triangle

4. Використання instanceof з типом об’єкта

У Java кожен клас неявно успадковує від класу Object . Отже, використання оператора instanceof з типом Object завжди буде мати значення true :

@Test public void givenWhenTypeIsOfObjectType_thenReturnTrue() { Thread thread = new Thread(); Assert.assertTrue(thread instanceof Object); }

5. Використання екземпляра оператора, коли об’єкт нульовий

Якщо ми використовуємо оператор instanceof для будь-якого об'єкта, що має значення null , він повертає false . Крім того, не потрібно перевіряти нуль при використанні оператора instanceof .

@Test public void givenWhenInstanceValueIsNull_thenReturnFalse() { Circle circle = null; Assert.assertFalse(circle instanceof Round); }

6. instanceof та Generics

Випробування екземплярів та відливки залежать від перевірки інформації про тип під час виконання. Тому ми не можемо використовувати instanceof разом зі стертими загальними типами .

Наприклад, якщо ми спробуємо скомпілювати такий фрагмент:

public static  void sort(List collection) { if (collection instanceof List) { // sort strings differently } // omitted }

Тоді ми отримуємо цю помилку компіляції:

error: illegal generic type for instanceof if (collection instanceof List) { ^

Технічно кажучи, нам дозволено використовувати лише instanceof разом із reifiedтипи в Java. Тип реіфікується, якщо інформація про його тип присутня під час виконання.

Переоцінені типи в Java такі:

  • Примітивні типи, такі як int
  • Неуніверсальні класи та інтерфейси, такі як String або Random
  • Загальні типи, у яких усі типи є необмеженими символами підстановки, такими як Set або Map
  • Сирі типи, такі як List або HashMap
  • Масиви інших типів, що піддаються рефіксації, таких як String [], List [] або Map []

Оскільки параметри загального типу не реіфіковані, ми також не можемо їх використовувати:

public static  boolean isOfType(Object input) { return input instanceof T; // won't compile }

Однак можна протестувати щось на зразок List :

if (collection instanceof List) { // do something }

7. Висновок

У цьому підручнику ми дізналися про оператор instanceof та про те, як ним користуватися. Повні зразки коду доступні на GitHub.