| Passing an argument of type `Class` to `Class#instanceOf(Class)` is usually a |
| mistake. |
| |
| Calling `clazz.instanceOf(obj)` for some `clazz` with type `Class<T>` is |
| equivalent to `obj instanceof T`. The `instanceOf` method exists for cases where |
| the type `T` is not known statically. |
| |
| When a class literal is passed as the argument of `instanceOf`, the result will |
| only be true if the class literal on left hand side is equal to `Class.class`. |
| |
| For example, the following code returns true if and only if the type `A` is |
| equal to `Class` (i.e. lhs is equal to `Class.class`). |
| |
| ```java |
| <A, B> boolean f(Class<A> lhs, Class<B> rhs) { |
| return lhs.instanceOf(rhs); // equivalent to 'lhs == Class.class' |
| } |
| ``` |
| |
| To test if the type represented by a class literal is a subtype of the type |
| represented by some other class literal, `isAssignableFrom` should be used |
| instead: |
| |
| ```java |
| <A, B> boolean f(Class<A> lhs, Class<B> rhs) { |
| return lhs.isAssignableFrom(rhs); // equivalent to 'B instanceof A' |
| } |
| ``` |