T не фактический класс. Это определяется во время компиляции в зависимости от использования вашего класса TemplateBuilder. Просто подумайте об этом как о заполнителе для различных возможных типов, один из которых выбирается в зависимости от ваших обстоятельств.
Для более простого примера посмотрите на следующее (адаптировано из учебника Java):
Представьте, что вы хотите объявить класс Box, который может принимать определенный тип (объекта для хранения внутри блока), но вы хотите использовать его в различных обстоятельствах для хранения различных типов.
Таким образом, вместо того, чтобы фиксировать фактический тип, который может принимать Box, вы объявляете его следующим образом:
public class Box<T> {
private T t; // T stands for "Type"
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
Когда вы используете его, вы делаете что-то вроде:
Box<Integer> integerBox = new Box<Integer>();
Какой смысл вы можете спросить? Почему бы не заставить Box взять объект?
Фактически до Java 1.5 это было невозможно. Это было введено для обеспечения дополнительной безопасности типов в этих ситуациях и было принято в рамках коллекций.
Весь смысл в том, что без этого механизма, если вместо этого он использовал Object, вы не можете заставить конкретный экземпляр вашего Box содержать только целые числа. С другой стороны, если вы сделали так, чтобы в нем использовались только целые числа, вы не можете повторно использовать свой Box для String или другие объекты, и вам потребуется создать другой тип класса Box.
До Java 1.5 такие объекты, как ArrayList, принимали обычные объекты, однако во время выполнения часто возникали случаи нарушения безопасности типов, поскольку программа принимает список объектов Integer и по ошибке где-то вставляет строку. Дженерики (через эту магическую Т) заставляют типы, не ограничивая, какими они могут быть.
В вашем случае T extends TemplateBuilder
делает еще один шаг и заявляет, что независимо от того, что это за T, это должен быть класс, расширяющий TemplateBuilder. Если бы этого не было, это был бы любой класс, расширяющий Object (универсальный базовый класс Java).