【发布时间】:2013-05-28 18:40:21
【问题描述】:
我有一个抽象类:
public abstract class RootProcessor<T> {
Class<T> clazz;
}
我需要用RootProcessor 的孩子填写ClassT clazz; - 每个孩子都有自己的T
我只找到了一种解决方案,但它需要编译器参数-Xlint:unchecked
public RootProcessor(){
this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
这是最好的解决方案吗?如果没有-Xlint:unchecked,我们可以做同样的事情吗?
【问题讨论】:
-
不要使用
-Xlint:unchecked,如果您需要不安全的演员表,请尽可能在本地使用@SuppressWarnings。 -
而且,是的,如果编译器无法从头到尾跟踪
T的类型,则无法在运行时安全地获取Class<T>。这里的类型安全但样板化的方法是简单地引入一个受保护的构造函数,该构造函数将clazz作为参数。 -
@millimoose:你为什么不把它写成答案呢?我几乎没有什么可以添加到您的 cmets ;-)
-
是的,这是一个很好的答案。我认为带参数的构造函数是一个很好的解决方案。这个问题的简单答案)))
-
例如:
key = gson.fromJson(json, key.getClass().getGenericSuperclass());修复key = gson.fromJson(json,HashMap.class);