Heim >Java >javaLernprogramm >Wie kann ich die Klasse eines generischen Typs zur Laufzeit bestimmen?

Wie kann ich die Klasse eines generischen Typs zur Laufzeit bestimmen?

Susan Sarandon
Susan SarandonOriginal
2024-11-11 21:31:03886Durchsuche

How Can I Determine the Class of a Generic Type at Runtime?

Klasse eines generischen Typs bestimmen

Bei der generischen Programmierung ist es oft wünschenswert, auf die Klasse des verwendeten generischen Typs zuzugreifen. Allerdings werden generische Typinformationen zur Laufzeit gelöscht, was diese Aufgabe grundsätzlich zu einer Herausforderung macht. In diesem Artikel wird eine effektive Problemumgehung zur Überwindung dieser Einschränkung untersucht.

Die Herausforderung

Beachten Sie den folgenden Codeausschnitt:

public class MyGenericClass<T> {
  public void doSomething() {
    T bean = (T)someObject.create(T.class);
  }
}

Dieser Code versucht dies Erstellen Sie eine Instanz vom Typ T mithilfe der Methode „create“ einer Drittanbieterbibliothek, die die tatsächliche Klasse von T als Argument erfordert. Der direkte Zugriff auf T.class führt jedoch zu einem Fehler „Ungültiges Klassenliteral für Typparameter T“.

Die Problemumgehung

Da generische Typinformationen zur Laufzeit gelöscht werden, ist dies eine Alternative Ansatz ist notwendig. Die folgende Problemumgehung umfasst das Erstellen einer statischen Factory-Methode, die die Klasse des generischen Typs als Argument akzeptiert:

public class MyGenericClass<T> {

    private final Class<T> clazz;

    public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) {
        return new MyGenericClass<U>(clazz);
    }

    protected MyGenericClass(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void doSomething() {
        T instance = clazz.newInstance();
    }
}

Verwendung

Um diese Problemumgehung zu verwenden, erstellen Sie eine Instanz von MyGenericClass mithilfe der Factory-Methode createMyGeneric:

MyGenericClass<MyClass> genericInstance = MyGenericClass.createMyGeneric(MyClass.class);

Dies ermöglicht den Zugriff auf die tatsächliche Klasse des generischen Typs über die clazz-Feld innerhalb der MyGenericClass-Instanz.

Nachteile

Diese Problemumgehung ist zwar funktionsfähig, fügt der Lösung jedoch einige Standardcodes hinzu. Darüber hinaus wird die Verwendung generischer Methoden oder Konstruktoren innerhalb der doSomething-Methode eingeschränkt, da diese nicht direkt auf die generischen Typinformationen zugreifen können.

Das obige ist der detaillierte Inhalt vonWie kann ich die Klasse eines generischen Typs zur Laufzeit bestimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn