instanceof. This binary operator is the fastest and most commonly used. If you have an instance of
A
and can specify B
explicitly, this is the preferred choice. If A
(or more precisely, the type of the variable holding an instance of A
) and B
are not in the same inheritance chain, the instance cannot possibly be a subtype of B
, and the compilation will fail with an inconvertible types
error.Class::isInstance. This method takes an object of type A as a parameter. It should be chosen when you have an instance of
A
available, but B
is not known at compile time. For instance, if you have variables A a
and Class bClass
, you can check with bClass.isInstance(a)
.Class::isAssignableFrom. This method takes
Class<A>
. It’s the only option left if you don't have an instance of A
. You would use it as bClass.isAssignableFrom(aClass)
.There is also a fourth method – attempting to cast an instance of type
A
to type B
. If the types are incompatible, this cast will throw a ClassCastException
. However, this is universally considered a poor practice, as building program logic on the basis of exceptions is not advisable. The reasoning behind this is detailed in Effective Java Item 57.