Екземпляр на 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 . Концепцията за връзка е базирана на наследяване на клас или реализация на интерфейс.

За да демонстрираме това, нека създадем 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 не може да се използва, ако няма връзка между обекта, който се сравнява, и типа, с който се сравнява.

Нека създадем нов клас Triangle, който реализира 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 Operator, когато обект е нулев

Ако използваме оператора instanceof за всеки обект, който е нулев , той връща 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 }

Възможно е обаче да тествате срещу нещо като Списък :

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

7. Заключение

В този урок научихме за оператора на instanceof и как да го използваме. Пълните примерни кодове са достъпни в GitHub.