Quais as diferenças entre Tipos Genéricos em C# e em Java?

As diferenças entre tipos genéricos em C# e em Java são sutis, mas importantes de se compreender. Vou explicar algumas delas:

  1. Sintaxe: A sintaxe usada para definir tipos genéricos em C# e em Java é diferente. Em C#, você usa o caractere ‘<>’ para definir um tipo genérico, enquanto em Java, utiliza-se o caractere ‘<>’.

Exemplo em C#:

List<int> listaInteiros = new List<int>();

Exemplo em Java:

List<Integer> listaInteiros = new ArrayList<>();
  1. Restrições (constraints): Em C#, você pode impor restrições em tipos genéricos usando a palavra-chave “where”, permitindo especificar que o tipo genérico deve ser um tipo de classe, tipo de valor, interface ou ter um construtor sem parâmetros. Em Java, não há suporte nativo para restrições em tipos genéricos.

Exemplo em C#:

public class Exemplo<T> where T : class
{
    // código da classe
}
  1. Inferência de tipos: Em C#, o compilador pode inferir o tipo genérico com base nos parâmetros passados para um método genérico. Isso significa que você pode omitir a especificação do tipo genérico ao chamar um método e deixar o compilador inferir o tipo com base nos argumentos passados. Em Java, não há suporte para inferência de tipos genéricos.

Exemplo em C#:

public void ExemploMetodo<T>(T item)
{
    // código do método
}

ExemploMetodo(10); // O compilador infere o tipo para int
  1. Wildcards em Java: Em Java, há o conceito de wildcards, que permitem representar tipos desconhecidos ou genéricos de maneira flexível. Isso pode ser útil quando você deseja escrever um código que possa lidar com diferentes tipos genéricos.

Exemplo em Java:

public void imprimirLista(List<?> lista)
{
    for (Object item : lista)
    {
        System.out.println(item);
    }
}

Essas são apenas algumas das diferenças entre tipos genéricos em C# e em Java. É importante ressaltar que, apesar das diferenças sintáticas e de recursos, ambos os idiomas oferecem suporte poderoso para a criação de tipos genéricos, permitindo a reutilização de código de maneira segura e eficiente.