T - это заполнитель для типа, который будет предоставлен классом реализации или создания экземпляра.
? это заполнитель, который говорит: «Я не знаю или неважно, что такое универсальный тип», обычно используемый, когда работа, которую вы будете выполнять над объектом-контейнером, не должна знать тип.
Причина, по которой вы не можете использовать '?' в определении класса / интерфейса это потому, что есть значение, определяющее имя заполнителя (и тип будет предоставлен в другом месте). Ставить '?' не имеет смысла.
Кроме того, заполнитель не обязательно должен быть T, он может использовать любую стандартную переменную Java. По соглашению, это один заглавный символ, но не обязательно.