Если вы хотите назначить класс для tableMapperClass , который на самом деле является подклассом TableMapper, вам необходимо изменить тип переменной. Вместо этого используйте:
Class<? extends TableMapper> tableMapperClass = null;
и теперь вы можете назначить TableMapper.class или любой подкласс этой переменной. Когда вы пишете Class<TableMapper>
, вы обещаете, что переменная будет точно TableMapper.class или null.
Другой пример:
Class<Number> number = Integer.class; // does not compile
Number number = new Integer(1); // compiles fine
Class<? extends Number> number = Integer.class; // also ok
Обратите внимание, что вы можете делать разные вещи с помощью Class<Number>
, тогда как вы можете Class<? extends Number>
. Например, вы можете вызвать конструктор Class<Number>
, потому что вы знаете класс. Вы не можете сделать это с Class<? extends Number>
, потому что конструкторы не определены во время компиляции.
Аналогично, скажем, List<Number>
против List<? extends Number>
. Вы можете вызвать list.add (7) для переменной типа List<Number>
, но вы не можете сделать это для List<? extends Number>
, потому что вы не знаете тип второго списка. Например, это может быть List<Double>
, в этом случае добавление целого числа не допускается.
Дженерики странные. :) Надеюсь, это поможет.