Как узнать, является ли A подтипом B?

В языке Java существует три способа, которыми можно проверить совместимость типов.

Во-первых, с помощью оператора instanceof. В нем в качестве первого аргумента передаётся экземпляр класса А, второй аргумент имя проверяемого класса В. Если экземпляр А не принадлежит к цепочке наследования класса В, то А не считается подтипом В и компилятор выдаст сообщение «inconvertible types». Это наиболее быстрый и популярный способ.

Во-вторых, с помощью метода isInstance(). Его применяют, когда экземпляр А имеется, а В неизвестен. Для двух переменных: А а, и Class bClass, проверку подтипов можно выполнить так: bClass.isInstance(a).

В-третьих, если экземпляр А несуществует, то можно воспользоваться методом isAssignableFrom(). Например: bClass.isAssignableFrom(aClass). Это самый долгий по времени выполнения способ.

Иногда, для проверки применяют операцию приведения типов. В этом случае пытаются привести экземпляр А к классу В. Если эта операция не удалась, то компилятор выдаст исключение ClassCastException. Этот способ неприемлем, так как строить логику программы на исключениях – плохой стиль программирования, способный привести к появлению большого количества багов, обнаружение которых затруднено.

a instanceof В
B.class.islnstance(a)
В.class.isAssignableFrom(A.class)
// так делать не надо! 
try {
  final В unused = (В) a;
  return true;
} catch (ClassCastException e) { 
  return false;
}
Поделиться уроком

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *