.getClass()
переменной типа Foo
может быть как Foo.class
, так и .class
любого из его подклассов. Компилятор страхуется от ClassCastException
в рантайме подменой возвращаемого типа метода на Class<? extends Foo>
.Подробнее об этом читайте на хабре.