headshot1
headshot1
采纳率100%
2018-10-19 10:06

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

  • arraylist
  • 泛型
  • class
已采纳

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • headshot1 headshot1 3年前

    自答:

    • 看了一些别人的说法,说是带泛型参数的变量要么是成员变量,要么是方法参数才能获取泛型参数类型,因为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 评论 复制链接分享