我正在使用反射遍历类的字段成员,我需要知道 List<> 子类的泛型类型参数是什么。
给定一个类型为 List 的子类的字段,我如何以通用方式判断 List<> 的类型参数是什么?
例如:
class X<T> {
List<String> x1; // String
ArrayList<String> x2; // String
SubclassOfArrayListString x3; // String
List<?> x4; // error
List<T> x5; // error
}
class SubclassOfArrayListString extends ArrayList<String> {
// ...
}
注意:我添加了 <T>
到上面的 X 来说明可能存在没有正确答案的情况 - 它与问题无关,只是在回答时需要考虑。
最佳答案
你不能,因为泛型类型信息在编译时丢失了(*)。这也是您无法创建某种通用类型数组的原因 T
在运行时。
在运行时,每个 List<T>
又是原始类型 List
-- 你甚至可以添加 Integer
声明为 List<String>
的东西,泛型不会也不能阻止[编辑:使用未经检查的强制转换或扩大对原始类型的强制转换;这将导致(可抑制的)编译器警告但没有错误]。
(*) 编辑:我学到了一些新的并经过更正的某些类型参数(GenericDeclaration 的实现者,如 Class
、Constructor
、Field
以及返回值、参数和Method
的异常类型)将保留在字节码中,并且可以在运行时使用 Field.getGenericType() 访问和类似的访问器。
关于java - 确定 List<> 的通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7247921/