Java泛型,获取泛型参数的Class<T>

标签 java generics

我有一个抽象类:

public abstract class RootProcessor<T> {
    Class<T> clazz;
}

我需要用 RootProcessor 的 child 填充 ClassT clazz; - 每个 child 都有自己的 T

我只找到了一种解决方案,但它需要编译器参数 -Xlint:unchecked

public RootProcessor(){
    this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

这是最好的解决方案吗?如果没有 -Xlint:unchecked 我们可以做同样的事情吗?

最佳答案

类型安全但样板化的方法是通过 Class<T>标记“编译器可以看到的地方”:

public abstract class RootProcessor<T> {
    Class<T> clazz;

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

public class FooProcessor extends RootProcessor<Foo> {
    public FooProcessor() {
        super(Foo.class);
    }
}

如果您正在执行未经检查的强制转换,但您“知道自己在做什么”并希望编译器停止提示,那么正确的方法是将非类型安全但您知道他们-工作位和使用 @SuppressWarnings :

public abstract class RootProcessor<T> {
    Class<T> clazz;
    { initClazz(); }

    @SuppressWarnings("unchecked")
    private void initClazz() {
        // the usual verbiage you already have in your question
        this.clazz = this.getClass().getGenericSuperclass().yadda().blah();
    }
}

(我不会反对你:P)

关于Java泛型,获取泛型参数的Class<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799129/

相关文章:

java - 如何将 Android Studio 的 ide 模板与 Udacity 的进行匹配?

Java POST 数据到 mySQL UTF-8 编码问题

java - 下面的代码在某些IDE中而不是在某些IDE中进行编译 “Java is Unsound”

swift - 如何将此函数转换为泛型类型?

c# - 为什么不能推断出这些泛型类型?

java rmi死锁

java - 无法通过nodeJs代码中制作的Java代码提取zip文件

c# - 是否可以将此代码的第二部分用于存储库模式和泛型

c# - 关于T型的问题

java - 如何重写矩形类中根据周长进行比较的compareTo方法?