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

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

TRANSLATE with

COPY THE URL BELOW

Back

EMBED THE SNIPPET BELOW IN YOUR SITE

Enable collaborative features and customize widget: Bing Webmaster Portal

Back

Copyright © 2088 世界杯欧洲预选赛_南非世界杯主题曲舞蹈 - lyzkxt.com All Rights Reserved.
友情链接