运行时的局部变量的通用类型

Java中是否有一种方法可以反映generics类型的局部变量? 我知道你应该用一个字段 – 获取generics类型的java.util.List 。 知道如何解决,例如:

public void foo(List s){ //reflect s somehow to get String } 

或者甚至更一般:

 public void foo(List s){ //reflect s somehow to get T } 

这是一个很好的教程,显示了如何以及何时可以使用reflection读取generics类型。 例如,从你的第一个foo方法中获取String

 public void foo(List s) { // .. } 

你可以使用这段代码

 class MyClass { public static void foo(List s) { // .. } public static void main(String[] args) throws Exception { Method method = MyClass.class.getMethod("foo", List.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); for (Type genericParameterType : genericParameterTypes) { if (genericParameterType instanceof ParameterizedType) { ParameterizedType aType = (ParameterizedType) genericParameterType; Type[] parameterArgTypes = aType.getActualTypeArguments(); for (Type parameterArgType : parameterArgTypes) { Class parameterArgClass = (Class) parameterArgType; System.out.println("parameterArgClass = " + parameterArgClass); } } } } } 

输出: parameterArgClass = class java.lang.String

这是可能的,因为在源代码中显式声明List只能包含字符串。 但是以防万一

 public  void foo2(List s){ //reflect s somehow to get T } 

T可以是任何东西,因为类型擦除,不可能检索关于精确T类的信息。

。 由于Java的类型擦除 ,所有generics都在编译过程中被剥离。

但是,您可以对列表中的元素使用instanceOfgetClass ,以查看它们是否与特定类型匹配。