В языке 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;
}