Sobes.tech
Middle+

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ó