В отличие от шаблонов C ++, шаблоны Java работают по типу стирания, поэтому он генерирует только один класс для всех значений T
и преобразует все ссылки на тип T
в этом классе в супер тип T
в в этом случае SuperClass
, затем используется виртуальная диспетчеризация для предоставления дисперсии для вызовов методов объекта и статическая диспетчеризация для вызовов статических методов.
Поэтому, когда вы делаете Dummy<SubClass>.print()
, компилятор не выполняет глобальную замену T
на SubClass
в Dummy
. Все, что делает компилятор, проверяет, использует ли T
в качестве аргумента или возвращаемого типа в методах Dummy
значение SubClass
. Никаких изменений внутри кода Dummy
нет, поэтому тот же самый статический метод SuperClass
вызывается независимо от того, что T
.
Если вам требуется различное поведение в универсальном классе в зависимости от параметризованного типа, вы должны передать объект этого типа и использовать виртуальный метод или передать класс для типа и использовать отражение.