Java获取泛型真实类型的方法


1、获取父类泛型类的泛型

public abstract class AbstractDao {
    public Class getActualType() {
        ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
        return (Class) parameterizedType.getActualTypeArguments()[0];
    }
}

public class UserDao extends AbstractDao {
    public static void main(String[] args) {
        UserDao userDao = new UserDao();
        Class actualType = userDao.getActualType();
        System.out.println(actualType.getName());
    }
}

2、获取成员变量的泛型

public class User {
    private List list;
    public static void main(String[] args) {
        try {
            Field field = User.class.getDeclaredField("list");
            Type genericType = field.getGenericType();
            if (genericType != null && genericType instanceof ParameterizedType) {
                Type actualType = ((ParameterizedType) genericType).getActualTypeArguments()[0];
                System.out.println(actualType.getTypeName());
            }
        } catch (Exception e) {
        }
    }
}

3、获取局部变量的泛型,注意:泛型必须以匿名内部类的方式

public abstract class AbstractDao {

    public Class getActualType() {
        ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
        return (Class) parameterizedType.getActualTypeArguments()[0];
    }

    public static void main(String[] args) {
        AbstractDao dao = new AbstractDao() {
        };
        System.out.println(dao.getActualType().getTypeName());
    }
}

4、通过接口/父类的匿名内部类作为参数传递到方法

在方法中可以获得匿名内部类继承的父类或实现的接口的泛型的真实类型

 AbstractDao如参考例子一,是一个带泛型的抽象类

打印如下:

总结一下
如果是继承基类而来的泛型,就用 getGenericSuperclass() , 转型为 ParameterizedType 来获得实际类型
如果是实现接口而来的泛型,就用 getGenericInterfaces() , 针对其中的元素转型为 ParameterizedType 来获得实际类型
我们所说的 Java 泛型在字节码中会被擦除,并不总是擦除为 Object 类型,而是擦除到上限类型
能否获得想要的类型可以在 IDE 中,或用 javap -v 来查看泛型签名来找到线索

转载:https://blog.csdn.net/qq_30038111/article/details/100611523

https://blog.csdn.net/hj7jay/article/details/54889717

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
Bing Webmaster Portal Back