我现在真的很困惑。我在另一个项目中使用以下代码没有任何问题:
public class ReadOnlyTable<T extends Model> implements ReadOnly<T> {
protected at.viswars.database.framework.core.DatabaseTable datasource;
private boolean debug = true;
protected ReadOnlyTable() {
initTable();
}
protected void reloadDataSource() {
initTable();
}
private void initTable() {
boolean readOnlyClass = false;
if (getClass().getSuperclass().equals(ReadOnlyTable.class)) readOnlyClass = true;
Class<T> dataClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
最后一行没有问题。现在我做了第二个项目,因为我在阅读课程时遇到了问题,我试图做最简单的案例:
public class GenericObject<T> implements IGenericObject<T> {
public GenericObject() {
init();
}
private void init() {
Class<T> clazz = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
}
此类在此处实例化:
GenericObject<String> go = new GenericObject<String>();
在我的第二个例子中,我将始终收到以下错误消息:
线程中的异常&#34; main&#34; java.lang.ClassCastException:java.lang.Class无法强制转换为java.lang.reflect.ParameterizedType
我错过了什么?这让我发疯了。任何帮助表示赞赏!
答案 0 :(得分:2)
您正在呼叫getGenericSuperclass()
,但您的班级没有通用超类。它的超类是Object
,如错误所示,它不能转换为ParameterizedType
。
您可能希望使用getGenericInterfaces()[0]
,因为您的类只实现了一个接口。
此处有更多信息:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces()
答案 1 :(得分:2)
无法从String
检索go
。对象实例化表达式(new GenericObject<String>()
)的类型参数在运行时不存在。这是类型擦除。
当类或接口扩展或实现具有特定类型参数的另一个类或接口时,您尝试使用的技术存在问题。例如class Something extends GenericObject<String>
。然后可以从类对象中获取此声明信息。这与你正在做的事情完全无关。