我有一个抽象类:
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/