Sobes.tech
Middle+

Is het mogelijk om tijdens de uitvoering van het programma toegang te krijgen tot het generieke type?

sobes.tech AI

Antwoord van AI

Nee, dat is niet mogelijk. Informatie over het generieke type wordt tijdens de compilatie verwijderd (type erasure). Alleen "ruwe" types zijn beschikbaar tijdens runtime.

Bijvoorbeeld:

List<String> strings = new ArrayList<>();
// Tijdens runtime gaat deze informatie verloren:
// type erasure

Daarom zal de volgende code niet werken zoals verwacht:

if (list instanceof List<String>) { // Compileerfout of waarschuwing
    // Deze code werkt niet als controle op List<String>
}

Toegang tot informatie over het generieke type kan via reflectie, maar alleen in bepaalde gevallen, bijvoorbeeld bij het werken met velden, methoden of handtekeningen van klassen waar het type expliciet in de broncode is gespecificeerd.

Voorbeeld van het verkrijgen van het type collectie uit een veld:

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 met info over <>

        if (genericType instanceof ParameterizedType) { // Controleren of het getypeerd is
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Argumenten

            for (Type type : actualTypeArguments) {
                System.out.println("Elementtype: " + type.getTypeName()); // Zal "java.lang.String" printen
            }
        }
    }
}

Het verkrijgen van het elementtype van een dynamisch gemaakte lijst is echter niet mogelijk:

List<Integer> intList = new ArrayList<>();
// Hier gaat de Integer-informatie verloren tijdens runtime

In de Android-context is dit vooral belangrijk bij het werken met generieke bibliotheken zoals Retrofit voor API-respons parsing. Vaak worden constructies zoals TypeToken uit Guava of vergelijkbare gebruikt om type-informatie tijdens runtime door te geven.

Voorbeeld van gebruik van TypeToken (uit Guava):

import com.google.common.reflect.TypeToken;
import java.util.List;

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Dit Type-object bevat informatie over List<String> en kan in runtime worden gebruikt