1

我现在真的很困惑。我在另一个项目中使用以下代码没有任何问题:

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>();

在我的第二个示例中,我将始终收到以下错误消息:

线程“主”java.lang.ClassCastException 中的异常:java.lang.Class 无法转换为 java.lang.reflect.ParameterizedType

我错过了什么??这让我发疯。任何帮助表示赞赏!

4

2 回答 2

4

无法从中String检索go。对象实例化表达式 ( new GenericObject<String>()) 的类型参数在运行时的任何地方都不存在。这是类型擦除。

当一个类接口扩展或实现具有特定类型参数的另一个类或接口时,您尝试使用的技术关注。例如class Something extends GenericObject<String>。那么就可以从类对象中得到这个声明信息了。这与您正在做的事情完全无关。

于 2013-02-09T21:44:52.930 回答
3

您正在调用getGenericSuperclass(),但您的类没有通用超类。它的超类是Object,不能ParameterizedType像错误所说的那样转换为。

您可能想要使用getGenericInterfaces()[0],因为您的类只实现了一个接口。

更多信息在这里:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces()

于 2013-02-09T14:50:53.443 回答