Passagem explícita de tipos para métodos genéricos em Java

Quando temos uma classe genérica em Java, precisamos sempre passar de forma explícita o tipo do parâmetro genérico. O uso da classe ArrayList<E> exemplifica isto.

List<Usuario> l = new ArrayList<Usuario>();

Aqui estamos indicando explicitamente que a nossa lista contém apenas instâncias da classe Usuario.

Problema

Quando criamos métodos genéricos, geralmente declaramos argumentos na assinatura do método que permitem ao compilador inferir o tipo genérico, sem que precisemos indicar de forma explícita. Como exemplo, temos o método Collections.copy() da API do Java que copia elementos de uma collection para outra. A declaração do método é:

public static <T> void copy(List<? super T> dest, List<? extends T> src) {
    // Copia os elementos de src para dest,
}

Se usarmos o método da seguinte forma:

List<Usuario> lista1 = new ArrayList<Usuario>();
List<Usuario> lista2 = new ArrayList<Usuario>();
Collections.copy(lista1, lista2);

Damos condições para que o compilador deduza, a partir do tipo dos argumentos dest e src, que T representa instâncias da classe Usuario. Mas há situações em que isso não é possível, como no método abaixo:

public class FabricaDeListas {
    public static <T> List<T> criarNovaListaDeQualquerCoisa() {
        return new ArrayList<T>();
    }
}

Aqui o compilador não dispõe de argumentos no método para tentar inferir o tipo T. Precisamos passar de forma explícita, assim como fazemos com classes. Mas como fazer isso?

Solução

A página 86 do livro Java Precisely (2ª edição, 2005), na seção 21.8 – Generic Methods, indica a sintaxe da linguagem para resolver o problema:

Classe.<Tipo1, Tipo2, ..., TipoN>metodoEstatico(); // Para métodos estáticos
instancia.<Tipo1, Tipo2, ..., TipoN>metodo(); // Para métodos de instância.

Ou seja, tomando o exemplo anterior, podemos escrever:

List<Usuario> = FabicaDeListas.<Usuario>criarNovaListaDeQualquerCoisa();
List<Cachorro> = FabicaDeListas.<Cachorro>criarNovaListaDeQualquerCoisa();

E assim sucessivamente. Notem que é preciso indicar de forma explícita a entidade que invoca o método, seja uma classe ou um objeto.

Anúncios
Passagem explícita de tipos para métodos genéricos em Java

Um comentário sobre “Passagem explícita de tipos para métodos genéricos em Java

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s