Groovy - Genéricos

Os genéricos permitem que os tipos (classes e interfaces) sejam parâmetros ao definir classes, interfaces e métodos. Muito parecido com os parâmetros formais mais familiares usados ​​em declarações de método, os parâmetros de tipo fornecem uma maneira de reutilizar o mesmo código com entradas diferentes. A diferença é que as entradas para parâmetros formais são valores, enquanto as entradas para digitar parâmetros são tipos.

Genérico para coleções

As classes de coleções, como a classe List, podem ser generalizadas de forma que apenas as coleções desse tipo sejam aceitas no aplicativo. Um exemplo de ArrayList generalizado é mostrado abaixo. O que a instrução a seguir faz é que ela só aceita itens de lista que são do tipo string -

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

No exemplo de código a seguir, estamos fazendo o seguinte -

  • Criando uma coleção ArrayList generalizada que conterá apenas Strings.
  • Adicione 3 strings à lista.
  • Para cada item da lista, imprimindo o valor das strings.
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);
      }
   } 
}

A saída do programa acima seria -

First String 
Second String 
Third String

Classes Generalizadas

A classe inteira também pode ser generalizada. Isso torna a classe mais flexível em aceitar qualquer tipo e trabalhar de acordo com esses tipos. Vejamos um exemplo de como podemos fazer isso.

No programa a seguir, estamos realizando as seguintes etapas -

  • Estamos criando uma classe chamada ListType. Observe as palavras-chave <T> colocadas na frente da definição da classe. Isso informa ao compilador que essa classe pode aceitar qualquer tipo. Então, quando declaramos um objeto desta classe, podemos especificar um tipo durante a declaração e esse tipo seria substituído no espaço reservado <T>

  • A classe genérica possui métodos getter e setter simples para trabalhar com a variável de membro definida na classe.

  • No programa principal, observe que podemos declarar objetos da classe ListType, mas de tipos diferentes. O primeiro é do tipo Integer e o segundo é do 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;
   } 
}

A saída do programa acima seria -

First String 
1