运行时局部变量的泛型类型

问题描述 投票:0回答:2

Java 有没有办法反映一个局部变量的泛型类型?我知道你可以用一个字段来做到这一点 - Get generic type of java.util.List。任何想法如何解决,例如:

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

或者更一般的:

public void foo<T>(List<T> s){
  //reflect s somehow to get T
}
java generics reflection type-erasure
2个回答
7
投票

。由于 Java 的Type Erasure,所有泛型在编译过程中都会被剥离。

然而,您可以在列表中的元素上使用

instanceOf
getClass
来查看它们是否匹配特定类型。


1
投票

这里 是一个很好的教程,展示了如何以及何时可以使用反射读取泛型类型。例如从你的第一个

foo
方法中获取 String

public void foo(List<String> s) {
    // ..
}

你可以使用这个代码

class MyClass {

    public static void foo(List<String> 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 <T> void foo2(List<T> s){
      //reflect s somehow to get T
}

T 可以是任何东西,因此由于类型擦除,无法检索有关精确 T 类的信息。

© www.soinside.com 2019 - 2024. All rights reserved.