java - 确定 List<> 的通用参数

标签 java generics reflection

我正在使用反射遍历类的字段成员,我需要知道 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 的实现者,如 ClassConstructorField 以及返回值、参数和Method 的异常类型)将保留在字节码中,并且可以在运行时使用 Field.getGenericType() 访问和类似的访问器。

关于java - 确定 List<> 的通用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7247921/

相关文章:

ios - 如何在 Swift 中向泛型类型添加类型方法?

haskell - 有没有办法使用泛型将 Maybe 构造函数应用于记录的每个字段?

java - 线程卡在 getDeclaredConstructors 中的可能原因?

c# - 如何使用泛型和 Linq 扩展方法过滤列表?

java - 使用 java 发送的邮件包含不正确的 html 符号

java - 是否有任何开源库可以获取java bean的getters的所有值?

java - WildFly - 无法访问管理控制台(404 错误代码)

java - 我还必须做什么才能让我的方法处理任何类型的对象

c# - 用反射清理我的代码

java - GAE 留言板 Java 教程。强制验证/签署 servlet 会导致重定向出现 405