2016-08-04 18 views
7

java.lang.reflect.Type nasıl Class<T> clazz dönüştürebilirim?Convert java.lang.reflect.Type için Sınıf <T> clazz

Ben Class<T> bir argüman olan bir sonraki gibi bir yöntem varsa:

public void oneMethod(Class<T> clazz) {  
    //Impl 
} 

Sonra java.lang.reflect.Type bir argüman vardır ve oneMethod(Class<T> clazz) çağırır ve bunun için ben Class<T> için java.lang.reflect.Type type dönüştürmek için gereken başka bir yöntem:

public void someMehtod(java.lang.reflect.Type type) { 
    // I want to pass type arg to other method converted in Class<T> 
    otherMethod(¿How to convert java.lang.reflect.Type to Class<T>?); 
} 

Mümkün mü?

cevap

6

type'un Class örneğinin olduğundan emin olmanız ve sonra yayınlamanız gerekir. Tabii

if (type instanceof Class) { 
    @SuppressWarnings("unchecked") 
    Class<?> clazz = (Class<?>) type; 
    otherMethod(clazz); 
} 

, ayrıca bir Class olmama durumunda başa çıkmak zorundadır.

-1

Bunu mu demek istediniz?

public <T extends Type> void oneMethod(T clazz) { 

} 

public void someMethod(Type type) { 
    oneMethod(type); 
} 
+1

Yalnızca sorunu – NatNgs

1

O Type için Javadoc

Tüm bilinen uygulama Sınıfları diyor ... Bir Type bir Class daha başka bir şey olacağını garip olurdu:

Yani sürece Sınıf ClassType s işlevini kullanan özel kitaplıklara sahip olabilirsiniz, kolayca yayınlayabilirsiniz - ancakiçin hazır olmanız gerekir. Dikkat: Java jenerikleri temsil etmek için belgesiz Tip uygulama kullanın, aşağıya bakın.

bir kontrolsüz istisnadır çünkü explicitely işlemek veya olamaz:

Açık yol:

try { 
    Class<?> clazz = (Class<?>) type; 
} 
catch (ClassCastException ex) { 
    // process exception 
} 

Örtülü yol:

Class<?> clazz = (Class<?>) type; 

ancak mevcut yöntem atabilseydin ..


@VeYy Turner'ın yorumu:

Dikkat: Type type = new ArrayList<String>().getClass().getGenericSuperclass();, bir Sınıf değil, bir Türü olan bir şey verir. Bu bir ParameterizedType, bu nedenle gerçek sınıfı bulmak için getRawType() yöntemini kullanabilirsiniz, ancak diğerleri bulunabilir.

+2

yönteminin içine taşıyorsunuz. 'Type type = new ArrayList () .getClass(). GetGenericSuperclass();' 'Type' değil,' Class' olan bir şey verir. [Ideone demo] (http://ideone.com/kwdkvj). –

+1

@AndyTurner: haklısınız, belgelenmemiş bir sınıf ... Bu parametre 'ParameterizedType' uygulandığını tahmin etmeli ve daha sonra gerçek bir Sınıf bulmak için getRawType() 'ı kullanmalıdır. –

+0

@SergeBallesta: Konu bu.'Type' Class'' bir örneği olabilir, ya da 'ParameterizedType', 'TypeVariable',' WildcardType' ya da' GenericArrayType' bir örneği olabilir. Son 4, arayüzlerdir; uygulama sınıfı uygun değildir. – newacct

İlgili konular