Bestimmen der Klasse eines generischen Typs
Im Bereich der generischen Programmierung kann es zwingend erforderlich sein, die Klasse des generischen Typs zu ermitteln ausgenutzt wird. Allerdings werden Typinformationen, wie es in der Natur von Generika liegt, typischerweise zur Laufzeit gelöscht, was eine Herausforderung beim späteren Abrufen darstellt.
Beispiel:
Betrachten Sie das folgende Generic Klasse:
public class MyGenericClass<T> { public void doSomething() { // ... T bean = (T)someObject.create(T.class); // ... } }
Im obigen Beispiel versuchen wir, eine Instanz der Klasse T zu erstellen, indem wir ein Klassenliteral übergeben. Dies führt jedoch zu einem Fehler „Ungültiges Klassenliteral für den Typparameter T“, da der Versuch, den generischen Typ als Klassenliteral zu verwenden, verboten ist.
Problemumgehung:
Um diese Herausforderung zu meistern, besteht eine praktikable Lösung darin, die Klasse des generischen Typs als Parameter an eine statische Methode zu übergeben. Diese Methode verwendet dann die Reflection-API, um den generischen Typ zu instanziieren.
public class MyGenericClass<T> { private final Class<T> clazz; public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) { return new MyGenericClass<>(clazz); } protected MyGenericClass(Class<T> clazz) { this.clazz = clazz; } public void doSomething() { T instance = clazz.newInstance(); } }
Durch diesen Ansatz umgehen wir die Einschränkung gegen die Verwendung generischer Typen als Klassenliterale und stellen so sicher, dass die erforderlichen Typinformationen zur Laufzeit verfügbar sind . Obwohl dies eine unelegante Lösung sein mag, bietet sie eine Möglichkeit, die Klasse eines generischen Typs in einem anspruchsvollen Kontext wie dem im ursprünglichen Beispiel dargestellten zu bestimmen.
Das obige ist der detaillierte Inhalt vonWie können Sie die Klasse eines generischen Typs zur Laufzeit bestimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!