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