Sobes.tech
Middle+

Ist es möglich, während der Programmausführung auf den Generik-Typ zuzugreifen?

sobes.tech KI

Antwort von AI

Nein, das ist nicht möglich. Die Information über den generischen Typ wird während der Kompilierung gelöscht (Type Erasure). Im Laufzeit sind nur "rohe" Typen verfügbar.

Zum Beispiel:

List<String> strings = new ArrayList<>();
// Während der Laufzeit gehen diese Informationen verloren:
// type erasure

Daher funktioniert der folgende Code nicht wie erwartet:

if (list instanceof List<String>) { // Kompilierungsfehler oder Warnung
    // Dieser Code funktioniert nicht als Überprüfung auf List<String>
}

Man kann auf die Information des generischen Typs durch Reflection zugreifen, aber nur in bestimmten Fällen, z.B. bei Feldern, Methoden oder Signaturen von Klassen, bei denen der Typ explizit im Quellcode angegeben wurde.

Beispiel zum Erhalten des Collection-Typs aus einem Feld:

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(); // Erhält einen Type, der die <>

        if (genericType instanceof ParameterizedType) { // Prüfen, ob der Typ parametrisiert ist
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Argumente des Typs

            for (Type type : actualTypeArguments) {
                System.out.println("Elementtyp: " + type.getTypeName()); // Gibt "java.lang.String" aus
            }
        }
    }
}

Aber es ist nicht möglich, den Elementtyp einer dynamisch erstellten Liste zu erhalten:

List<Integer> intList = new ArrayList<>();
// Hier gehen die Informationen über Integer im Runtime verloren

Im Android-Kontext ist dies besonders wichtig, wenn mit generischen Bibliotheken gearbeitet wird, z.B. Retrofit zum Parsen von API-Antworten. Dort werden häufig Konstruktionen wie TypeToken aus Guava oder deren Äquivalente verwendet, um die Typinformationen zur Laufzeit zu übergeben.

Beispiel für die Verwendung von TypeToken (aus Guava):

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

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Dieses Type-Objekt enthält die Information über List<String> und kann in der Laufzeit verwendet werden