instanceof – бинарный оператор, самый быстрый и самый используемый. Если есть экземпляр
A
и можно указать B
явно, выбирать надо его. Если A
(точнее тип хранящей экземпляр A
переменной) и B
не из одной цепочки наследования – экземпляр точно не может быть подтипом B
и компиляция упадет с ошибкой inconvertible types
.Class::isInstance – метод принимает параметром объект типа A. Его стоит выбрать, когда экземпляр
A
в наличии, но B
– неизвестный на этапе компиляции тип. То есть, для переменных A a
и Class bClass
, можем проверить bClass.isInstance(a)
.Class::isAssignableFrom – принимает
Class<A>
. Единственное, что остается, если экземпляра A
нет. bClass.isAssignableFrom(aClass)
.Есть еще четвертый способ – имея экземпляр типа
A
привести его к B
. Если типы были несовместимы, приведение выбросит ClassCastException
. Это во всех смыслах плохой способ, построению логики программы на исключениях нет оправдания. Подробная аргументация описана в Effective Java Item 57.