我可以从泛型类型参数中获取.class吗?

2022-09-02 13:28:32

我有以下类:

public abstract class MyClass<T extends Object> {

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,T.class); // T.class isn't allowed :(
    }
}

如何将 Class<T> 实例传递到其中?有没有一些奇怪和古怪的工作?

有没有办法从 T 类型的预实例化对象获取类<T>引用?它也不会让我这样做:

T t = new T();
Class<T> klass = t.class;

尝试 #2

有趣的是,如果我从类定义中删除“扩展JSONOBjBase”,我只会得到一个未经检查的强制转换警告(没有错误)。有没有另一种方法可以写出演员阵容?

eclipse screenshot


答案 1

否。
由于类型擦除,此信息在运行时不存在。

相反,您可以重用 GSON 的 TypeToken hack,它会创建一个继承封闭泛型基类的匿名类。


答案 2

或者,可以将 Class 作为构造函数参数发送,并使用该对象,而不是尝试获取 T.class。

public abstract class MyClass<T extends Object> {

    private Class<T> klass;

    public MyClass(Class<T> klass) {
        this.klass = klass;
    }

    protected T createNewFromData(Reader reader){
        GSON.fromJSON(reader,klass); 
    }
}

推荐