I tried to understand what is the reason for getClass method to return Class<? extends |X|>?
From the openjdk near public final native Class<?> getClass();:
The actual result type is
Class<? extends |X|>where|X|is the erasure of the static type of the expression on whichgetClassis called.
Why can't getClass have the same type such as XClass.class, for example:
class Foo {}
Foo fooInstance = new Foo();
Class<Foo> fc = Foo.class; // Works!
Class<Foo> fc2 = fooInstance.getClass(); // Type mismatch ;(
Class<?> fc3 = fooInstance.getClass(); // Works!
Class<? extends Foo> fc4 = fooInstance.getClass(); // Works!