我正在使用反射来走一个类的字段成员,我需要知道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> {
// ...
}
注意:我在上面的X中添加了<T>
来说明可能存在没有正确答案的情况 - 它与问题无关,除了在回答时要考虑的事项。
答案 0 :(得分:1)
您不能,因为编译(*)会丢失泛型类型信息。这也是你无法在运行时创建一些泛型类型T
的数组的原因。
在运行时,每个List<T>
都是原始类型List
- 您甚至可以将Integer
添加到声明为List<String>
的内容中,泛型不会也可以防止[编辑:使用未经检查的强制转换或扩展强制转换为原始类型;这将导致(可抑制的)编译器警告但没有错误]。
(*)编辑:我学习了一些新的和经过修正的特定类型参数(GenericDeclaration的实现者,如Class
,Constructor
,{{1并且Field
的返回,参数和异常类型将保留在字节代码中,并且可以在运行时使用Field.getGenericType()和类似的访问器进行访问。
答案 1 :(得分:0)
public class X<T extends List> {
T field;
}
这就是你需要的吗?
答案 2 :(得分:0)
阅读本教程关于泛型:Generics Tutorial。这应该清楚了。
这个pdf在通配符使用结束时也有很好的例子以及extends ans super关键字。 PDF Doc
基本上,当您想要从容器中读取时,请使用Container<? extends A>
如果要写入容器,请使用Container<? super A>
。