É possível aceder ao tipo genérico durante a execução do programa?
sobes.tech IA
Resposta da IA
Não, não é possível. A informação sobre o tipo genérico é apagada durante a compilação (type erasure). Apenas os "tipos crus" estão disponíveis em tempo de execução.
Por exemplo:
List<String> strings = new ArrayList<>();
// Durante a execução, esta informação será perdida:
// type erasure
Portanto, o código seguinte não funcionará como esperado:
if (list instanceof List<String>) { // Erro de compilação ou aviso
// Este código não funcionará como uma verificação de List<String>
}
É possível acessar a informação do tipo genérico através de reflexão, mas apenas em certos casos, por exemplo, ao trabalhar com campos, métodos ou assinaturas de classes onde o tipo foi explicitamente especificado no código fonte.
Exemplo de obtenção do tipo de coleção a partir de um campo:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
public class MyClass {
List<String> stringList;
public static void main(String[] args) throws Exception {
Field field = MyClass.class.getDeclaredField("stringList");
Type genericType = field.getGenericType(); // Obtém um Type que contém a informação de <>
if (genericType instanceof ParameterizedType) { // Verifica se o tipo está parametrizado
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Obtém os argumentos do tipo
for (Type type : actualTypeArguments) {
System.out.println("Tipo do elemento: " + type.getTypeName()); // Mostrará "java.lang.String"
}
}
}
}
Mas não será possível obter o tipo do elemento de uma lista criada dinamicamente:
List<Integer> intList = new ArrayList<>();
// Aqui, a informação sobre Integer é perdida em runtime
No contexto do Android, isso é especialmente importante ao trabalhar com bibliotecas que usam genéricos, como Retrofit para analisar respostas de API. Muitas vezes, são usadas construções como TypeToken do Guava ou seus análogos para passar informações do tipo em tempo de execução.
Exemplo de uso de TypeToken (do Guava):
import com.google.common.reflect.TypeToken;
import java.util.List;
Type listStringType = new TypeToken<List<String>>() {}.getType();
// Este objeto Type contém informações sobre List<String> e pode ser usado em runtime