Sobes.tech
Middle

O que são tipos genéricos?

sobes.tech IA

Resposta da IA

Os tipos genéricos permitem definir classes, interfaces e métodos usando parâmetros de tipo. Isto aumenta a flexibilidade, a reutilização e a segurança de tipos do código, permitindo trabalhar com diferentes tipos de dados sem perder a verificação de tipos em tempo de compilação.

Vantagens principais:

  • Segurança de tipos: O compilador verifica os tipos na fase de compilação, prevenindo erros em tempo de execução relacionados com incompatibilidades de tipos.
  • Reutilização: O mesmo código pode ser usado com diferentes tipos de dados, reduzindo a duplicação de código.
  • Desempenho: Em algumas linguagens (por exemplo, C#), os tipos genéricos são implementados considerando um tipo específico, o que pode melhorar o desempenho em comparação com o uso de Object.

Exemplos de uso:

  • Coleções: Listas, dicionários, conjuntos parametrizados pelo tipo de elementos.
  • Métodos: Métodos que trabalham com qualquer tipo de dados que implemente uma interface específica.
  • Classes: Classes envolventes, fábricas, que trabalham com tipos de parâmetros.

Exemplo em C#:

// Lista genérica
List<string> nomes = new List<string>();
nomes.Add("Alice");
nomes.Add("Bob");

// Método genérico
public T ObterPrimeiroElemento<T>(List<T> lista)
{
    if (lista != null && lista.Count > 0)
    {
        return lista[0];
    }
    return default(T); // Retorna o valor padrão para o tipo T
}

Exemplo em Java:

// Lista genérica
List<String> nomes = new ArrayList<>();
nomes.add("Alice");
nomes.add("Bob");

// Método genérico
public <T> T obterPrimeiroElemento(List<T> lista) {
    if (lista != null && !lista.isEmpty()) {
        return lista.get(0);
    }
    return null; // Retorna null para tipos de referência
}

Exemplo em Python (type hinting):

from typing import List, TypeVar

T = TypeVar('T')

def obter_primeiro_elemento(dados: List[T]) -> T | None:
    # A função pode trabalhar com qualquer lista e retornar um elemento dela
    if dados:
        return dados[0]
    return None

nomes: List[str] = ["Alice", "Bob"]
primeiro_nome = obter_primeiro_elemento(nomes) # IDE entende que primeiro_nome é str

Em algumas linguagens (Java), os tipos genéricos usam "apagamento" (type erasure), onde a informação do tipo de parâmetro é removida na fase de compilação. Isto pode levar a algumas limitações. Em outras linguagens (C#, Go), a informação do tipo é mantida em tempo de execução.

Os tipos genéricos são uma ferramenta fundamental para escrever código limpo, seguro e reutilizável.