2017-08-28 84 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类型参数在当时不可用(仅编译)。

类型擦除