headshot1 2018-10-19 10:06 采纳率: 25%
浏览 6996
已采纳

怎样获取List的泛型参数,如List<String>?

ArrayList extends AbstractList,如果用反射getGenericSuperClass()......获取到的
是E,只有自定义一个继承自ArrayList的类才能得到String。

  • 写回答

1条回答 默认 最新

  • headshot1 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。如果你想说这代码不够优雅,那我也没办法了。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算