Как вы уже догадались, T стирается компилятором. Когда вы создаете экземпляр объекта, он понятия не имеет, что должен иметь дело с XMLStatusMessage объектами. Ваш базовый класс определит следующий шаблонный метод, а ковариантные возвращаемые типы 1.5 будут удовлетворять компилятор конкретными подклассами:
public Class<T> getExpectedMessageType()
Существует один мета-комментарий: он очень похож на процедурный код, где что-то вызывает getExpectedMessageType () , а затем выполняет действие на основе типа возвращаемого значения. Это может быть лучше реализовано с использованием шаблона Visitor, когда посетитель реализует методы "doSomething" для каждого из подклассов XMLMessage .