美文网首页
Java获取派生类泛型真实类型

Java获取派生类泛型真实类型

作者: giafei | 来源:发表于2019-10-11 14:28 被阅读0次
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.LinkedList;

public class TestActualClass {
    private static class D1 {}
    private static class D2 {}
    private static class D3 {}


    private static class B1<T> {}
    private static class B2<T> extends B1<T> {}
    private static class B3<T> extends B1<D1> {}
    private static class B4 extends B2<D2> {}
    private static class B5 extends B3<D3> {}

    private static Class<?> getFirstActualType(Class<?> genericSuperClass, Class<?> finalClass) {
        if (genericSuperClass.getTypeParameters().length == 0)
            return null;

        if (!genericSuperClass.isAssignableFrom(finalClass))
            return null;

        LinkedList<Class<?>> stack = new LinkedList<>();

        while (finalClass != genericSuperClass) {
            stack.add(finalClass);
            finalClass = finalClass.getSuperclass();
        }

        while (!stack.isEmpty()) {
            Class<?> aClass = stack.pollLast();
            Type type = aClass.getGenericSuperclass();
            if (!(type instanceof ParameterizedType)) {
                continue;
            }

            Type[] actualTypes = ((ParameterizedType) type).getActualTypeArguments();
            if (actualTypes == null || actualTypes.length == 0)
                return null;

            Type actualType = actualTypes[0];
            if (actualType instanceof Class)
                return (Class<?>)actualType;
        }

        return null;
    }

    public static void main(String[] args) {
        //B1类的类型没有确定 输出null
        System.out.println(getFirstActualType(B1.class, B2.class));

        //B3虽然还是泛型, 但B1类已确定是D1  输出 D1
        System.out.println(getFirstActualType(B1.class, B3.class));

        //输出 D2
        System.out.println(getFirstActualType(B1.class, B4.class));

        //输出 D1
        System.out.println(getFirstActualType(B1.class, B5.class));
    }
}

相关文章

  • Java获取派生类泛型真实类型

  • Java 注解:注解处理器获取泛型真实类型

    [TOC] Java 注解:注解处理器获取泛型真实类型 注解 annotation 是 Java 中的一大特性,是...

  • Java如何在运行时获取泛型的类型

    Java泛型是伪泛型,会在编译完成时进行类型的擦除,我们无法在运行时获取泛型参数的具体类型(类型擦除会被替换成泛型...

  • Java泛型的原始类型

    众所周知,Java中的泛型在编译期被擦除,那有没有办法在运行时获取到泛型的原始类型呢?有的。 获取泛型类型 如果定...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • 【进阶之路】Java的类型擦除式泛型

    【进阶之路】Java的类型擦除式泛型 Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Jav...

  • java 泛型

    1,如何实例化泛型 2,如何获取java中的泛型类型 调用(通常在构造方法中调用):

  • Java 获取泛型类型

    不太完美的泛型 大家在使用泛型开发的时候,有很多时候会遇到这样的需求—— 获取泛型具体的类。比如现在有Servic...

  • java泛型

    java泛型 Java 泛型的参数只可以代表类,不能代表个别对象。 由于 Java 泛型的类型参数之实际类型在编译...

  • Kotlin学习笔记-其他

    一.泛型 在使用java的泛型时候,下面的代码无法通过编译的。因为为了泛型的类型安全,Java 中的泛型类型是 不...

网友评论

      本文标题:Java获取派生类泛型真实类型

      本文链接:https://www.haomeiwen.com/subject/wnitmctx.html