У класса может быть несколько параметров типа, с помощью которых можно добиваться расширяемого поведения класса. Например, класс Array имеет один параметр типа :
Внутри класса Array, тип T является абстрактным и поэтому его поля и метода недоступны. Но когда вы объявляете массив вам нужно указать его тип : например Array<Int> или Array<String>. Это будет действовать также, как если бы вы заменили все типы T в объявлении Array на тип, который вы указали.
Параметр типа очень полезен для строгой типизации контейнеров таких как Array, List, Tree...
Вы можете определять свои собственные параметризованные классы с несколькими параметрами типа для собственного использования, когда вам это нужно.
===== Ограниченные параметры =====
Удобно иметь возможность определять абстрактные параметры, но также можно накладывать на них несколько ограничений для того, чтобы иметь возможность использовать их в реализации класса. Например:
Хотя полю evt в этом классе назначен тип его параметра, типизатор знает, что оно имеет оба типа - Event и EventDispatcher, поэтому он может получать к нему доступ, как если бы оно реализовывало оба класса. Позже, при создании EvtQueue, типизатор проверит расширяет(extends) или реализует(implements) параметр эти два типа - Event и EventDispatcher.
Ограничения параметров типов - очень мощный продвинутый функционал, который может быть действительно полезен для написания гибкого, универсального кода, подходящего для использования в разных приложениях.