Groovy - Genéricos

Los genéricos permiten que los tipos (clases e interfaces) sean parámetros al definir clases, interfaces y métodos. Al igual que los parámetros formales más familiares utilizados en las declaraciones de métodos, los parámetros de tipo proporcionan una forma de reutilizar el mismo código con diferentes entradas. La diferencia es que las entradas a los parámetros formales son valores, mientras que las entradas a los parámetros de tipo son tipos.

Genérico para colecciones

Las clases de colecciones como la clase List se pueden generalizar para que solo las colecciones de ese tipo sean aceptadas en la aplicación. A continuación se muestra un ejemplo de ArrayList generalizado. Lo que hace la siguiente declaración es que solo acepta elementos de lista que son del tipo cadena:

List<String> list = new ArrayList<String>();

En el siguiente ejemplo de código, estamos haciendo lo siguiente:

  • Creando una colección ArrayList generalizada que contendrá solo Strings.
  • Agrega 3 cadenas a la lista.
  • Para cada elemento de la lista, se imprime el valor de las cadenas.
class Example {
   static void main(String[] args) {
      // Creating a generic List collection
      List<String> list = new ArrayList<String>();
      list.add("First String");
      list.add("Second String");
      list.add("Third String");
		
      for(String str : list) {
         println(str);
      }
   } 
}

El resultado del programa anterior sería:

First String 
Second String 
Third String

Clases generalizadas

También se puede generalizar toda la clase. Esto hace que la clase sea más flexible para aceptar cualquier tipo y trabajar en consecuencia con esos tipos. Veamos un ejemplo de cómo podemos lograr esto.

En el siguiente programa, estamos realizando los siguientes pasos:

  • Estamos creando una clase llamada ListType. Tenga en cuenta las palabras clave <T> colocadas delante de la definición de clase. Esto le dice al compilador que esta clase puede aceptar cualquier tipo. Entonces, cuando declaramos un objeto de esta clase, podemos especificar un tipo durante la declaración y ese tipo sería reemplazado en el marcador de posición <T>

  • La clase genérica tiene métodos getter y setter simples para trabajar con la variable miembro definida en la clase.

  • En el programa principal, observe que podemos declarar objetos de la clase ListType, pero de diferentes tipos. El primero es del tipo Integer y el segundo es del tipo String.

class Example {
   static void main(String[] args) {
      // Creating a generic List collection 
      ListType<String> lststr = new ListType<>();
      lststr.set("First String");
      println(lststr.get()); 
		
      ListType<Integer> lstint = new ListType<>();
      lstint.set(1);
      println(lstint.get());
   }
} 

public class ListType<T> {
   private T localt;
	
   public T get() {
      return this.localt;
   }
	
   public void set(T plocal) {
      this.localt = plocal;
   } 
}

El resultado del programa anterior sería:

First String 
1