Parámetros de tipo
Una clase puede tener varios parámetros de tipo que se pueden usar para obtener un comportamiento extensible. Por ejemplo, la clase Array tiene un parámetro de tipo:
class Array<T> { function new() { // ... } function get( pos : Int ) : T { // ... } function set( pos : Int, val : T ) : Void { // ... } }
Dentro de la clase Array, el tipo T es abstracto lo que significa que sus campos y métodos no son accesibles. Sin embargo, cuando declaras un arreglo tienes que especificar su tipo : Array<Int> o Array<String>, por ejemplo. Esto funciona de la misma manera que si hubieses sustituido todos los tipos T en la declaración de Array con el tipo que estás especificando.
El parámetro de tipo es muy útil para conseguir tipado estricto en contenedores como Array, List y Tree. Puedes definir tus propias clases parameterizadas usando varios parámetros de tipo para tu propio uso cuando los necesites.
Parámetros restrictivos
Aunque está bien eso de poder definir parámetros abstractos, también es posible definir varias restricciones (constraints) sobre ellos de manera que podamos usarlos en la implementación de clases. Por ejemplo :
class EvtQueue<T : (Event, EventDispatcher)> { var evt : T; // ... }
En esta clase, aunque el campo evt es un parámetro de clase, el gestor de tipos sabe que tiene ambos tipos Event y EventDispatcher, de manera que puede acceder a él como si estuviese implementando ambas clases. Más adelante, cuando se cree una EvtQueue, el gestor de tipos comprobará que el parámetro de tipo extiende o implementa ambos tipos Event y EventDispatcher. Cuando se definen múltiples parámetros restrictivos para un único parámetro de clase, como en el ejemplo anterior, deben ponerse entre paréntesis para que no existan ambigüedades en caso de que se declaren más parámetros de clase tras éste.
Las restricciones de los parámetros de tipo son una característica potente que permite al desarrollador escribir código genérico que puede reutilizarse en aplicaciones diferentes.