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