Sobes.tech
Middle+

È possibile accedere al tipo generico durante l'esecuzione del programma?

sobes.tech AI

Risposta dell'AI

No, non è possibile. L'informazione sul tipo generico viene cancellata durante la compilazione (type erasure). In runtime sono disponibili solo i "tipi grezzi".

Ad esempio:

List<String> strings = new ArrayList<>();
// Durante l'esecuzione, questa informazione verrà persa:
// type erasure

Pertanto, il seguente codice non funzionerà come previsto:

if (list instanceof List<String>) { // Errore di compilazione o avviso
    // Questo codice non funzionerà come verifica di List<String>
}

È possibile accedere alle informazioni sul tipo generico tramite riflessione, ma solo in alcuni casi, ad esempio lavorando con campi, metodi o firme di classi in cui il tipo è stato esplicitamente specificato nel codice sorgente.

Esempio di recupero del tipo di collezione da un 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(); // Ottieni un Type che contiene l'informazione di <>

        if (genericType instanceof ParameterizedType) { // Verifica se il tipo è parametrizzato
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Ottieni gli argomenti del tipo

            for (Type type : actualTypeArguments) {
                System.out.println("Tipo dell'elemento: " + type.getTypeName()); // Mostrerà "java.lang.String"
            }
        }
    }
}

Ma non sarà possibile ottenere il tipo dell'elemento di una lista creata dinamicamente:

List<Integer> intList = new ArrayList<>();
// Qui, l'informazione su Integer si perde in runtime

Nel contesto Android, questo è particolarmente importante quando si lavora con librerie che usano generici, come Retrofit per il parsing delle risposte API. Spesso si usano strutture come TypeToken di Guava o equivalenti per trasmettere le informazioni sul tipo in runtime.

Esempio di utilizzo di TypeToken (da Guava):

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

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Questo oggetto Type contiene informazioni su List<String> e può essere usato in runtime