2010-07-14 15 views
15

Ich habe eine SchnittstelleWie konkret Typ einer generischen Schnittstelle bekommen

public interface FooBar<T> { } 

Ich habe eine Klasse, die es

public class BarFoo implements FooBar<Person> { }

Mit Reflexion implementiert, ich eine Instanz von BarFoo nehmen wollen und dass die Version von FooBar, die es implementiert, Person ist.

Ich benutze .getInterfaces von BarFoo zu FooBar zurück zu bekommen, aber das hilft mir nicht herausfinden, was T ist.

Antwort

24

Sie können Class#getGenericInterfaces() generische Schnittstellen einer Klasse greifen die Sie dann wiederum prüfen, ob es sich um eine ParameterizedType ist und dann die actual type arguments entsprechend greifen.

Type[] genericInterfaces = BarFoo.class.getGenericInterfaces(); 
for (Type genericInterface : genericInterfaces) { 
    if (genericInterface instanceof ParameterizedType) { 
     Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments(); 
     for (Type genericType : genericTypes) { 
      System.out.println("Generic type: " + genericType); 
     } 
    } 
} 
+0

Vielen Dank! Casting nach ParameterizedType half – bwawok

+0

Gern geschehen. – BalusC

+4

Beachten Sie bitte, dass dies nicht funktioniert, wenn sie 'BarFoo' als generische' BarFoo 'definieren und dann' neue BarFoo () 'verwenden, obwohl dies äquivalent zu" ihrer "Perspektive wäre. –

5

versuchen, etwas wie folgt aus:

Class<T> thisClass = null; 
Type type = getClass().getGenericSuperclass(); 
if (type instanceof ParameterizedType) { 
    ParameterizedType parameterizedType = (ParameterizedType) type; 
    Type[] typeArguments = parameterizedType.getActualTypeArguments(); 
    thisClass = (Class<T>) typeArguments[0]; 
} 
+1

GenericSuperClass! = GenericInterface – BalusC

+0

schließen, aber es hat mich nicht an die Schnittstelle. BalusC hatte das fehlende Glied. – bwawok

+1

ah verpasste den Unterschied. Nun, verwenden Sie dies, wenn Sie jemals die GenericSuperClass :) –

Verwandte Themen