确定List<>的通用参数

时间:2011-08-30 18:24:41

标签: 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> {
   // ...
}

注意:我在上面的X中添加了<T>来说明可能存在没有正确答案的情况 - 它与问题无关,除了在回答时要考虑的事项。

3 个答案:

答案 0 :(得分:1)

您不能,因为编译(*)会丢失泛型类型信息。这也是你无法在运行时创建一些泛型类型T的数组的原因。

在运行时,每个List<T>都是原始类型List - 您甚至可以将Integer添加到声明为List<String>的内容中,泛型不会也可以防止[编辑:使用未经检查的强制转换或扩展强制转换为原始类型;这将导致(可抑制的)编译器警告但没有错误]。

(*)编辑:我学习了一些新的和经过修正的特定类型参数(GenericDeclaration的实现者,如ClassConstructor,{{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>