【发布时间】:2021-11-09 09:43:05
【问题描述】:
假设我们有一个类型CustomMap<A, B>,它扩展了CommonMap<C, D>,而Map<E, F>又实现了Map<E, F>。
自然会期望A == C == E,但并非总是如此 - 例如,您可以让CustomMap<V> 实现Map<String, V>。
问题是,假设我有一个Field,而field.getType() 是实现Map<K, V> 的某个接口或类。类型本身可能是非泛型的,也可能是泛型的,但具有不同于<K, V> 的泛型签名等。我如何使用反射获得Map 的K 和V 类型参数?
【问题讨论】:
-
你不能。 Java 有type erasure,这意味着类型参数在编译代码时会被删除。结果类型是最具体的绑定类型,可能是
Object。 -
这不正确,类型信息保留在字段中,您可以通过
field.getGenericType()获取。 -
这是可能的,但是正确处理所有极端情况的代码会很糟糕。例如,字段的类型可以引用声明类的类型变量,其边界引用声明类的外部类的类型变量。当遍历字段类型的超类型层次结构时,可能存在类似的极端情况,以用它们的实际参数替换类型变量。另外,没有公共实现类型或工厂方法来生成对象来表达结果(即在找到实际的
X和Y之后为Map<X,Y>构造ParameterizedType)。 -
这有点麻烦,但在实践中完全可行。我将发布我所学到的要点。
标签: java generics reflection collections