我有一个抽象类:

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

我需要用ClassT clazz;的 child 填充RootProcessor-每个 child 都有自己的T
我只找到一种解决方案,但它需要编译器参数-Xlint:unchecked
public RootProcessor(){
    this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

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

最佳答案

实现此目的的类型安全但很简单的方法是“在编译器可以看到的地方”传递Class<T> token :

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)

09-10 00:59