Sobes.tech
Middle+

Este posibil să se acceseze tipul generic în timpul execuției programului?

sobes.tech AI

Răspuns de la AI

Nu, nu este posibil. Informația despre tipul generic este ștersă în timpul compilării (type erasure). În timpul execuției sunt disponibile doar tipurile "pătrate".

De exemplu:

List<String> strings = new ArrayList<>();
// În timpul execuției, această informație se va pierde:
// type erasure

Prin urmare, următorul cod nu va funcționa așa cum se așteaptă:

if (list instanceof List<String>) { // Eroare de compilare sau avertisment
    // Acest cod nu va funcționa ca verificare pentru List<String>
}

Se poate accesa informația despre tipul generic prin reflecție, dar doar în anumite cazuri, de exemplu, atunci când lucrați cu câmpuri, metode sau semnături de clase în care tipul a fost specificat explicit în codul sursă.

Exemplu de obținere a tipului colecției dintr-un câmp:

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(); // Obțineți un Type care conține informația despre <>

        if (genericType instanceof ParameterizedType) { // Verificați dacă tipul este parametrizat
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Argumente de tip

            for (Type type : actualTypeArguments) {
                System.out.println("Tipul elementului: " + type.getTypeName()); // Va afișa "java.lang.String"
            }
        }
    }
}

Dar nu se poate obține tipul elementului dintr-o listă creată dinamic:

List<Integer> intList = new ArrayList<>();
// Aici, informația despre Integer se pierde în runtime

În contextul Android, acest lucru este deosebit de important atunci când lucrați cu biblioteci care utilizează generice, cum ar fi Retrofit pentru parsarea răspunsurilor API. Se folosesc adesea construcții precum TypeToken din Guava sau echivalentele sale pentru a transmite informația despre tip în timpul execuției.

Exemplu de utilizare a TypeToken (din Guava):

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

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Acest obiect Type conține informații despre List<String> și poate fi utilizat în runtime