2017-08-28 90 views
1

是否可以將泛型類的類型轉換爲java中給定的Class對象?像這樣:Java:給出類對象的泛型類

public ModelBin<?> getModelBin(Class type) { 
    return (ModelBin<type>) entities.get(type); 
} 

編譯器告訴我它無法將類型解析爲類型。我知道我可以做到這一點,

public ModelBin<?> getModelBin(Class type) { 
    return entities.get(type); 
} 

,它會工作,但後來我不得不在節目以後施放每個模型出來的模型箱 - 這是更多的工作。


我做了一些更多的閱讀,並結束了與此:

public <T> ModelBin<T> getModelBin(Class<T> type) { 
    return (ModelBin<T>) entities.get(type); 
} 

這是否有功能可按返回ModelBin<type>對象?

+0

實體是一個'HashMap >' –

+1

沒有任何類型安全的解決方案。您必須確保地圖只能包含有效的映射。此外,使用'類'而不是原始的'Class'。 – shmosel

+0

隨着類型擦除,這是更加困難的,因爲在運行時,您可能無法確定該類型是ModelBin的一個實例 | https://docs.oracle.com/javase/tutorial/java/generics/erasure.html – jrtapsell

回答

1
public <T> ModelBin<T> getModelBin(Class<T> type) { 
    return (ModelBin<T>) entities.get(type); 
} 

此的另一個example是普遍接受的方式在一個類型安全的方式來做到這一點。

final ModelBin<String> myStrBin = getModelBin(String.class); 

會正確編譯。

請問這有函數返回一個ModelBin對象嗎?

這對編譯器看起來是正確的,是的。在運行時,返回的ModelBin不會有類型(由於擦除),但這只是Java設計的方式。

0

不,這是不可能的,原因是Type Erasure。在您的代碼中,它決定使用運行時值指定要轉換的類,由於Type Erasure類型參數在當時不可用(僅編譯)。

類型擦除