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:
-
A
TypeTokenosztály vagy hasonló konstrukciók használata: Generikus osztály példányosításakor át lehet adni egyClass<T>objektumot, vagy anonim alosztályt használva megőrizni a típusinformációt. -
Reflexió
ParameterizedTypehaszná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.