我有一个抽象类:
public abstract class RootProcessor<T> { Class<T> clazz; }
我需要充实ClassT clazz;的孩子RootProcessor-每个孩子都有自己的孩子T
ClassT clazz;
RootProcessor
T
我只找到一种解决方案,但需要编译器参数 -Xlint:unchecked
-Xlint:unchecked
public RootProcessor(){ this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; }
这是最好的解决方案吗?没有我们可以做同样的事情-Xlint:unchecked吗?
实现此目的的类型安全但很简单的方法是传递Class<T>令牌“编译器可以看到它的位置”:
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:
@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)