Java获取实际的通用参数

时间:2015-02-25 08:10:41

标签: java generics parameters

我正在使用java 7.在尝试提取派生类的实际泛型参数时,我使用以下代码:

Class<E> cls = (Class<E>) ((ParameterizedType)   
                  getClass().getGenericSuperclass())
                            .getActualTypeArguments()[0];

它通常运行良好,但如果我有多重继承的情况(C扩展B扩展A)而B也是抽象(尚未声明实际的通用参数)我递归地获取基类之前的类(B并且在B上使用这个方法(而不是getClass())[因为如果我在C上使用它,它的超类不会是参数化类型],而实际的类型参数显示了泛型类型(我得到T为使用这个)。

如果有人遇到这种情况,我会感谢任何帮助或指导。

2 个答案:

答案 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;