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-у