2010-07-14 28 views
15

Ben bir arabirim var bunu yansıması ileNasıl genel arabirimi somut türüne yakalanma

public class BarFoo implements FooBar<Person> { }

, ben BarFoo bir örneğini almak isteyen uygulayan bir sınıf var

public interface FooBar<T> { } 

ve bunu uyguladığı FooBar'ın versiyonunun Kişidir.

FooBar'a geri dönmek için BarFoo'dan .getInterfaces kullanıyorum, ancak bu T'nin ne olduğunu öğrenmeme yardımcı olmuyor. Aşağıdaki gibi

cevap

24

Sen ardından dönüş kontrol altında bir ParameterizedType ise hangi Class#getGenericInterfaces() bir sınıfın genel arabirimleri kapmak ve sonra buna göre actual type arguments yakalayabilir.

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

İhtiyacınız olursa, bunu kullanın Büyük teşekkürler! ParameterizedType'a Döküm, – bwawok

+0

'a yardımcı oldu. – BalusC

+4

Sadece 'BarFoo' genel 'BarFoo ' olarak tanımladıktan sonra 'yeni' BarFoo () 'işlevini kullanıp kullanmamaları, bunun" kendi "perspektifinden eşdeğer olsa da, bunun işe yaramayacağını unutmayın. –

5

deneyin şey:

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

yakın, ama bana arayüzüne alamadım. BalusC eksik bağlantıya sahipti. – bwawok

+1

ah farkı kaçırdı. GenericSuperClass :) –

İlgili konular