首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过反射获取继承的参数化字段类?

如何通过反射获取继承的参数化字段类?
EN

Stack Overflow用户
提问于 2018-07-16 20:42:20
回答 2查看 56关注 0票数 0
代码语言:javascript
运行
复制
class A extends B<C> {
   ...
}

class B<T extends E> {
   ...
   public D<T> field;
}

如何从"field“反射中获取"C”类?

现在我只能获得"B“类字段作为"A”超类字段,并且看起来他们不知道哪个类型参数是从"A“传递的,并且只显示类型"E”。

EN

Stack Overflow用户

回答已采纳

发布于 2018-07-16 21:11:19

尽管A使用具体类型C扩展了B,但这并不会改变您从反射中获得的B字段的类型。

但是,您可以手动将字段的类型变量映射到具体类型。首先为A类构建TypeVariable到具体类型的映射,然后使用该映射将B中的类型变量转换为具体类型。

代码语言:javascript
运行
复制
Class<?> cls = A.class; // using `A` as an example
Class<?> sup = cls.getSuperclass();

 // TypeVariables of `B`
TypeVariable<?>[] tv = sup.getTypeParameters();
 // Concrete types used to extend with in `A`
Type[] actual = ((ParameterizedType) cls.getGenericSuperclass()).getActualTypeArguments();

Map<TypeVariable<?>, Type> mappings // map one to the other
    = IntStream.range(0, tv.length)
        .boxed()
        .collect(Collectors.toMap(i -> tv[i], i -> actual[i]));


for(Field f : sup.getDeclaredFields()) {
    Type t1 = f.getGenericType();
    System.out.println(t1); // prints `D<T>`
    Type t2 = concretify(t1, mappings);
    System.out.println(t2); // prints `D<C>`
}
代码语言:javascript
运行
复制
public static Type concretify(Type from, Map<TypeVariable<?>, Type> mappings) {
    if(from instanceof ParameterizedType) {
        ParameterizedType pt = (ParameterizedType) from;

        Type[] ts = pt.getActualTypeArguments();
        Type[] result = new Type[ts.length];
        for (int i = 0; i < ts.length; i++) {
            result[i] = mappings.getOrDefault(ts[i], ts[i]);
        }

        return new ParameterizedType() { // some ParameterizedType implementation

            @Override
            public Type getRawType() {
                return pt.getRawType();
            }

            @Override
            public Type getOwnerType() {
                return pt.getOwnerType();
            }

            @Override
            public Type[] getActualTypeArguments() {
                return result;
            }

            @Override
            public String toString() {
                return String.format("%s<%s>", getRawType().getTypeName(),
                    Arrays.stream(getActualTypeArguments())
                        .map(Type::getTypeName)
                        .collect(Collectors.joining(",")));
            }
        };
    }
    return from;
}
票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51362110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档