ArrayList extends AbstractList,如果用反射getGenericSuperClass()......获取到的
是E,只有自定义一个继承自ArrayList的类才能得到String。
怎样获取List的泛型参数,如List<String>?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 「已注销」 2018-10-21 11:37关注
自答:
- 看了一些别人的说法,说是带泛型参数的变量要么是成员变量,要么是方法参数才能获取泛型参数类型,因为java在类的方面只提供了一个getGenericSuperClass()的方法,只能获取到父类的泛型参数类型。在成员变量和方法上还有getGenericType()和getGenericParameterTypes()方法。这是泛型的类型擦除导致的,具体我还没有探究。
- 但这不是纯粹的泛型,因为要明确给出类型才能获取。如定义方法
getName(List<String> lists)
,使用反射可以很容易得到String类型,但如果把方法改为getName(List<T>
lists),无论你使用什么方法都不可能得到运行时给出的T的类型,只能得到字符串“T”。有人说有个什么框架(忘了)采用了这样一个方法:定义一个内部类,把T传给该类的成员变量,然后使用匿名内部类得到该成员变量,我试了,绕了一大圈,最后得到的还是“T”,要想得到运行时传递的泛型参数类型,就必须在方法中明确声明泛型类型。 - 那么如果真的想使用纯粹的泛型参数(确实有这个需求,比如设计一些工具方法时)怎么办呢,其实有一种方法,不需要反射(如果用反射,代码还要多几行),就是加一个Class的参数,如getName(Class clazz, List
<T>
lists),这样调用方法时给出clazz即可,而clazz就是T的Class。如果你想说这代码不够优雅,那我也没办法了。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用 4