获得T.class尽管Java的类型擦除

2022-09-02 19:46:53

我正在尝试将接口绑定到其实现,就像从配置文件中读取一样,以便我可以将其馈送到我的 IoC 容器。以下是我大致想要做的事情:

public class PropertyImplementationBinder<T> {
    // ...
    public Class getInterfaceClass() {
        return T.class; // OR Class<T>, note T is not newable
    }
    public Class getImplementationClass() {
        return /* read config file to get implementation class */;
    }
}

是否有可能以某种方式获得?T.class


答案 1

您需要将类显式传递到构造函数中(并自行存储)。

private final Class<T> clazz;

PropertyImplementationBinder(Class<T> clazz){
    this.clazz = clazz;
}

public Class<T> getInterfaceClass() {
    return clazz;
}

答案 2

您可以获取类的泛型超类的实际类型参数。这篇博客文章探讨了这所带来的可能性,包括使用琐碎的匿名内部类的一个很好的小技巧。直接引用:

事实证明,虽然 JVM 不会跟踪泛型类实例的实际类型参数,但它确实跟踪泛型类子类的实际类型参数。换句话说,虽然 a 实际上只是在运行时,但如果一个类扩展 ,那么 JVM 知道它是 类型参数的实际类型参数。new ArrayList<String>()new ArrayList()ArrayList<String>StringList


推荐