运行时的局部变量的通用类型
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都在编译过程中被剥离。
但是,您可以对列表中的元素使用instanceOf
或getClass
,以查看它们是否与特定类型匹配。