2015-09-25 38 views
2

我有下面的類結構的泛型類字段類型:獲得與Java思考

public class GenClass<T> { 
    public T elem; 
} 

我使用的方式如下:

public class Test { 
    public GenClass<UUID> data; 

現在我想ELEM類型使用數據的字段對象(Test.class.getField("data")) 但是,當我使用getType檢索類時,通用信息被剝離。

如何將通用信息從getGenericType映射到類對象以檢索具有正確類型的字段?

編輯︰由於有一些誤解,我試圖澄清我的問題。 考慮這個例子:

public class AClass<T, Q> { 
    public Q elem; 
    // some other code using T... 
} 

public class BClass<T, Q> { 
    public T elem; 
    // some other code using Q... 
} 

現在我想一個函數來獲取類ELEM的:

public class Test { 
    public AClass<UUID, String> a; 
    public BClass<Integer, Float> b; 

    void do() throws Exception { 
     Field aField = Test.class.getField("a"); 
     Field bField = Test.class.getField("b"); 

     getType(aField, "elem"); // should return String.class 
     getType(bField, "elem"); // should return Integer.class 
    } 

    Class<?> getType(Field f, String classField) { 
     // ??? 
    } 
} 

我怎麼需要實現getType得到我想要的結果?

+0

檢查http://stackoverflow.com/questions/1901164/get-type-of-a-generic-parameter-in-java-with-reflection – user2953113

+0

但我不知道,該字段的實際類型參數中的哪一個用於elem。也許我有一個像AClass 這樣的課程,然後聲明'B數據'。我怎麼知道,數據是第三種類型的論點? – darkbit

回答

1

您有Type對象對應於您的字段data,從調用getGenericType

Type t = f.getGenericType(); // f is your Field 

Type interface及其實現代表什麼樣的類型可能是在座不同的情況。因爲data的類型是GenClass<UUID>,使用類型參數進行參數化,所以此處返回的Type實際上是ParameterizedType

ParameterizedType pt = (ParameterizedType) t; 

通常可能有多個泛型類型參數,但這裏只有一個。致電ParameterizedType's getActualTypeArguments method

Type parameter = pt.getActualTypeArguments()[0]; 

是的,我們有另一個Type實例,但這個代表Field,而不是Field本身的泛型類型參數。因爲您在Test課程中提供了班級類型,所以此Type只不過是普通的Class - UUID.class

System.out.println(parameter instanceof Class); 
System.out.println(parameter == UUID.class); 

輸出:

true 
true 
+0

看看我編輯的問題,以更好地解釋我的問題! – darkbit