Sobes.tech
Middle+

Est-il possible d'accéder au type générique lors de l'exécution du programme?

sobes.tech IA

Réponse de l'IA

Non, ce n'est pas possible. L'information sur le type générique est effacée lors de la compilation (type erasure). Seuls les "types bruts" sont disponibles en temps d'exécution.

Par exemple :

List<String> strings = new ArrayList<>();
// Pendant l'exécution, cette information sera perdue :
// type erasure

Par conséquent, le code suivant ne fonctionnera pas comme prévu :

if (list instanceof List<String>) { // Erreur de compilation ou avertissement
    // Ce code ne fonctionnera pas comme une vérification de List<String>
}

Il est possible d'accéder à l'information du type générique via la réflexion, mais seulement dans certains cas, par exemple lors du travail avec des champs, des méthodes ou des signatures de classes où le type a été explicitement spécifié dans le code source.

Exemple d'obtention du type de collection à partir d'un champ :

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(); // Obtient un Type contenant l'information de <>

        if (genericType instanceof ParameterizedType) { // Vérifie si le type est paramétré
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Obtient les arguments du type

            for (Type type : actualTypeArguments) {
                System.out.println("Type de l'élément : " + type.getTypeName()); // Affichera "java.lang.String"
            }
        }
    }
}

Mais il ne sera pas possible d'obtenir le type de l'élément d'une liste créée dynamiquement :

List<Integer> intList = new ArrayList<>();
// Ici, l'information sur Integer est perdue en runtime

Dans le contexte Android, cela est particulièrement important lors de l'utilisation de bibliothèques utilisant des génériques, comme Retrofit pour analyser les réponses API. On utilise souvent des constructions comme TypeToken de Guava ou ses équivalents pour transmettre l'information du type en runtime.

Exemple d'utilisation de TypeToken (de Guava) :

import com.google.common.reflect.TypeToken;
import java.util.List;

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Cet objet Type contient l'information sur List<String> et peut être utilisé en runtime