Lehetséges hozzáférni a generikus típushoz a program futása közben?
sobes.tech MI
Válasz az MI-től
Nem, ez nem lehetséges. A generikus típusokra vonatkozó információk fordítás közben törlődnek (type erasure). Csak a "nyers" típusok érhetők el futásidőben.
Például:
List<String> strings = new ArrayList<>();
// Futásidőben ez az információ elveszik:
// type erasure
Ezért a következő kód nem fog működni a vártnak megfelelően:
if (list instanceof List<String>) { // Fordítási hiba vagy figyelmeztetés
// Ez a kód nem fog működni List<String> ellenőrzésként
}
A generikus típus információhoz reflektálással lehet hozzáférni, de csak bizonyos esetekben, például akkor, amikor mezőkkel, metódusokkal vagy osztályszignatúrákkal dolgozik, ahol a típus egyértelműen meg van adva a forráskódban.
Példa a kollekció típusának lekérésére egy mezőből:
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(); // Egy Type, ami tartalmazza az <>
if (genericType instanceof ParameterizedType) { // Ellenőrizzük, hogy paraméterezett-e a típus
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Típus argumentumok
for (Type type : actualTypeArguments) {
System.out.println("Elem típusa: " + type.getTypeName()); // "java.lang.String" fog kiíródni
}
}
}
}
De dinamikusan létrehozott lista elem típusát nem lehet lekérdezni:
List<Integer> intList = new ArrayList<>();
// Itt az Integer típus információja elveszik futásidőben
Az Android környezetben ez különösen fontos, amikor generikusokat használó könyvtárakkal, például Retrofit-tal dolgozik az API-válaszok elemzése során. Gyakran használnak olyan konstrukciókat, mint a Guava TypeToken vagy azok megfelelői, hogy a típusinformációt futásidőben átadják.
A TypeToken használatának példája (Guava):
import com.google.common.reflect.TypeToken;
import java.util.List;
Type listStringType = new TypeToken<List<String>>() {}.getType();
// Ez a Type objektum tartalmazza a List<String> típus információit, és futásidőben használható