Sobes.tech
Middle+

Da li je moguće tokom izvršavanja programa pristupiti tipu generika?

sobes.tech АИ

Одговор од АИ

Не, није могуће. Информације о типу генерика се бришу током компилације (type erasure). Током извршавања су доступни само "сирови" типови.

На пример:

List<String> strings = new ArrayList<>();
// Током извршавања ове информације ће бити изгубљене:
// type erasure

Због тога следећи код неће радити онако како се очекује:

if (list instanceof List<String>) { // Грешка у компилацији или упозорење
    // Овај код неће радити као провера на List<String>
}

Можете приступити информацијама о типу генерика преко рефлексије, али само у одређеним случајевима, на пример, када радите са пољима, методама или сигнатурама класа где је тип јасно наведен у изворном коду.

Пример добијања типа колекције из поља:

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(); // Добијамо Type који садржи информације о <>

        if (genericType instanceof ParameterizedType) { // Проверавамо да ли је тип параметризован
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Добијамо аргументе типа

            for (Type type : actualTypeArguments) {
                System.out.println("Тип елемента: " + type.getTypeName()); // Исписа "java.lang.String"
            }
        }
    }
}

Али добијање типа елемента листе која је креирана динамички више није могуће:

List<Integer> intList = new ArrayList<>();
// Овде информације о Integer су изгубљене у runtime-у

У контексту Android-а ово је посебно важно узети у обзир када радите са библиотекама које користе генерике, као што је Retrofit за парсирање одговора са API-ја. Тамо се често користе конструкције типа TypeToken из Guava или његови аналози за пренос информација о типу током извршавања.

Пример коришћења TypeToken (из Guava):

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

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Овај објекат Type садржи информације о List<String> и може се користити у runtime-у