我正在使用java 7.在尝试提取派生类的实际泛型参数时,我使用以下代码:
Class<E> cls = (Class<E>) ((ParameterizedType)
getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
它通常运行良好,但如果我有多重继承的情况(C扩展B扩展A)而B也是抽象(尚未声明实际的通用参数)我递归地获取基类之前的类(B并且在B上使用这个方法(而不是getClass())[因为如果我在C上使用它,它的超类不会是参数化类型],而实际的类型参数显示了泛型类型(我得到T为使用这个)。
如果有人遇到这种情况,我会感谢任何帮助或指导。
答案 0 :(得分:0)
你的问题可能是泛型是不变的。如你所说,它通常运作良好,但继承 - 你有麻烦...
对于任何两种不同的类型A和B,Class<A>
既不是子类型也不是a
超Class<B>
[JLS,4.10]。
答案 1 :(得分:0)
要解决具有多重继承的类型参数,最好的办法是使用类似TypeTools的内容。
class A<T> {}
class B<T> extends A<T> {}
class C extends B<String> {}
// Resolve the type argument for A using type information from C
Class<?> t = TypeResolver.resolveRawArgument(A.class, C.class);
assert t == String.class;