【问题标题】:Java get actual generic parametersJava获取实际的泛型参数
【发布时间】:2015-02-27 05:23:59
【问题描述】:

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

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

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

如果有人遇到这种情况,我将不胜感激任何帮助或指导。

【问题讨论】:

  • 为什么要提取派生类的实际泛型参数?
  • 注意'C extends B extends A'不是多重继承,即'C extends B and A'
  • 是的,它不是多重继承(在 java 7 中不存在),这就是我在括号中添加解释的原因。我的整个案例是一个派生许多类的基类,我想对所有这些类中的实际泛型做一个动作..但有些类不是直接从那个类派生的(中间有那个 B 类)在这种情况下,实际参数的提取会检索 T 而不是实际参数。
  • 到底是什么问题?
  • 问题是如何在类的方法中获取泛型的实际类型,该类的子类型具有子类型,并且泛型的声明仅在最子类型的类中。跨度>

标签: java generics parameters


【解决方案1】:

要解析具有多重继承的类型参数,最好的办法是使用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;

【讨论】:

  • 非常感谢!这就是我一直在寻找的。​​span>
【解决方案2】:

您的问题可能是泛型是不变的。正如你所说,它通常运作良好,但是继承 - 你有麻烦了......
对于任何两种不同的类型 A 和 B,Class&lt;A&gt; 既不是子类型也不是 Class&lt;B&gt; [JLS, 4.10] 的超类型。

【讨论】:

  • 是的,但是类 B 扩展了类 A,我想从 A 中的方法中找到实际值。这种情况有效,但如果有 C extends A 及以上B 扩展 C,它不起作用。
  • 我是否可以建议为测试目的添加一些代码,以便在这种情况下使您的调试工作更轻松。连续两次链接 .getClass().getGenericSuperclass() 并尝试使用有问题的继承链,看看它是否会通过。它确实通过了,为长继承链编写一个解决方法。
  • 我确实得到了 getSuperclass.getGenericSuperclass,它得到了我 T,这是 C 中的通用声明,这就是我的问题所在,我做了一个获取超类的循环,直到它达到我想要的那个..而且我似乎并没有以这种方式获得实际的通用性。似乎它只适用于直接子类型......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2013-09-13
  • 2011-05-29
  • 2015-06-04
相关资源
最近更新 更多