Sobes.tech
Middle

Hogyan lehet meghatározni a generikus osztályban használt paraméter típusát futás közben?

sobes.tech MI

Válasz az MI-től

Java-ban a tíruszárítás (type erasure) miatt a generikus osztályok paramétertípusaira vonatkozó információk a fordítás során nem kerülnek a bájtkódba, így a paraméter típusát futásidőben közvetlenül nem lehet meghatározni.

Azonban több módszer is létezik ennek az információnak a megszerzésére:

  1. A TypeToken osztály vagy hasonló konstrukciók használata: Generikus osztály példányosításakor át lehet adni egy Class<T> objektumot, vagy anonim alosztályt használva megőrizni a típusinformációt.

  2. Reflexió ParameterizedType használatával: Ha a generikus osztály a típusinformációt egy mezőben vagy konstruktorban tárolja, reflektálással elérhető.

Példa Class<T> átadásával:

public class GenericClass<T> {
    private Class<T> type;

    public GenericClass(Class<T> type) {
        this.type = type;
    }

    public void printType() {
        System.out.println("Paraméter típus: " + type.getName());
    }
}

GenericClass<String> instance = new GenericClass<>(String.class);
instance.printType(); // Kiírja: Paraméter típus: java.lang.String

Ezért a paraméter típusának futásidejű meghatározásához általában szükséges azt kifejezetten átadni vagy tárolni, mivel a Java szabványos mechanizmusai a típusok törlése miatt nem teszik lehetővé a megszerzését.