Проверка интерфейса через instanceof в Java
Оператор instanceof проверяет тип значения во время
выполнения. Для интерфейса выражение obj instanceof Figure
даст true, если объект создан классом, реализующим
Figure. Пример проверки на класс и интерфейс:
interface Figure {
double area();
}
class Disk implements Figure {
private final double radius;
public Disk(double radius) {
this.radius = radius;
}
@Override
public double area() {
return 3.14 * radius * radius;
}
}
Создадим Disk в переменной Figure и проверим тип через
instanceof:
Figure shape = new Disk(2.0);
System.out.println(shape instanceof Disk);
System.out.println(shape instanceof Figure);
Отрицание записывают как !(value instanceof Type).
После успешной проверки внутри if переменную
можно безопасно использовать как тип интерфейса:
static void describe(Object value) {
if (value instanceof Figure figure) {
System.out.println(figure.area());
}
}
Проверка интерфейса удобна, когда в одной коллекции лежат объекты разных классов, а обрабатывать нужно только те, что подходят под общий контракт:
interface VolumeFigure {
double volume();
}
static void printAreas(java.util.List<Object> items) {
for (Object item : items) {
if (item instanceof Figure figure) {
System.out.println(figure.area());
} else if (item instanceof VolumeFigure volume) {
System.out.println(volume.volume());
}
}
}
Сделайте интерфейс Payable с методом pay.
Сделайте класс Employee, реализующий Payable.
Запишите в список Object несколько объектов
Employee и других типов. Переберите список
и вызовите pay только у элементов,
для которых instanceof Payable даёт true.