2015-07-21 15 views
11

Ich erkläre eine Klasse wie folgt:Den Wert einer generischen Deklaration programmgesteuert abrufen?

public class SomeClass extends AdditionalClass<GenericClass> { 
    ... 
} 

Diese ...

SomeClass object = new SomeClass(); 
System.out.println(object.getSuperClass().getSimpleName()); 

... yields "AdditionalClass". Mit welchem ​​Methodenaufruf oder mit welchen Anrufen würde ich dieses Objekt abfragen und als Ergebnis "GenericClass" erhalten?

+2

Nicht verwandt mit Ihrer Frage, aber warum möchten Sie den generischen Typ prüfen? – CKing

+0

Ich entpacke programmatisch Deklarationen aus einer Anwendung, sodass sie nicht technischen Benutzern in einer übersichtlichen Tabelle zur Verfügung gestellt werden können. –

+0

In Ordnung. Ich wollte nur sicherstellen, dass Sie nicht den falschen Weg für eine einfachere Aufgabe nehmen. Aber warum interessieren sich nicht-technische Benutzer für den generischen Typ? – CKing

Antwort

14

Sie müssen das Array ParameterizedType (s) der Superklasse holen. Zum Beispiel:

SomeClass object = new SomeClass(); 
Type parameterizedClassType = 
     ((ParameterizedType) object.getClass().getGenericSuperclass()) 
     .getActualTypeArguments()[0]; 
System.out.println(parameterizedClassType.getTypeName()); 

Dies sollte com.whateverpackage.GenericClass drucken.

Beachten Sie, dass auch Löschtyp tritt auf, wenn SomeClass kompiliert wird, wird die Typparameter Informationen über die übergeordnete Klasse (n) erhalten, weil sie Teil der Definition der Klasse sind.

Wenn jedoch SomeClass war eine generische (dh war so etwas wie SomeClass<X> extends AdditionalClass<GenericClass>), dann für alle SomeClass Instanzen der Typ-Parameter (dh <X>) mit einigen tatsächlichen Typ hätte, ersetzt die nicht gewesen Teil des .getActualTypeParameters() Arrays.

+0

Funktioniert das, wenn 'GenericClass' selbst ein generischer Typ ist? d. h. Liste

+0

Es funktioniert, ja. Es lohnt sich, es auszuprobieren :) –

+0

Ich bin dabei;) Es funktioniert nicht, wenn Sie die 'parametrizedClassType' in' Class', obwohl. Aber solange Sie mit dem 'Type' arbeiten, sollte alles in Ordnung sein. –

Verwandte Themen