Sobes.tech
Middle

Como é que se pode determinar o tipo de parâmetro utilizado numa classe genérica durante a execução?

sobes.tech IA

Resposta da IA

Em Java, devido à eliminação de tipos (type erasure) durante a compilação, a informação sobre os tipos dos parâmetros genéricos não é preservada no bytecode, portanto, não é possível determinar diretamente o tipo do parâmetro em tempo de execução.

No entanto, existem várias maneiras de obter essa informação:

  1. Usar a classe TypeToken ou construções semelhantes: Ao criar uma instância de uma classe genérica, pode-se passar um objeto Class<T> ou usar uma subclasse anônima para preservar a informação do tipo.

  2. Reflexão usando ParameterizedType: Se a classe genérica armazena a informação do tipo em um campo ou construtor, ela pode ser acessada via reflexão.

Exemplo com passagem de Class<T>:

public class GenericClass<T> {
    private Class<T> type;

    public GenericClass(Class<T> type) {
        this.type = type;
    }

    public void printType() {
        System.out.println("Tipo do parâmetro: " + type.getName());
    }
}

GenericClass<String> instance = new GenericClass<>(String.class);
instance.printType(); // Vai imprimir: Tipo do parâmetro: java.lang.String

Assim, para determinar o tipo do parâmetro em tempo de execução, geralmente é necessário passá-lo ou armazená-lo explicitamente, pois os mecanismos padrão do Java não permitem obtê-lo devido à eliminação de tipos.