2011-08-30 35 views
2

的泛型参数我正在使用反射来遍历一个类的字段成员,我需要知道列表<>子类,泛型类型参数是什么。确定列表<>

给定一个类型为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说明,有可能是情况下,有没有一个正确的答案 - 它没有任何的问题,只是被一些在回答时考虑。

+2

[获取泛型类型的java.util.List]可能的重复(http://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list) – BalusC

+0

所以你想要的东西喜欢这个? x1 - > [class java.lang.String],x2 - > [Class java.lang.String],x3:class SubclassOfArrayListString,x4 - > [?](WildcardType),x5 - > [T](TypeVariable) –

+0

Philipp :x3-> String,x4/x5是“undefined”,所以只要我可以确定它们还没有完整类型,那很好。 – slipheed

回答

1

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

在运行时,每一个List<T>又是一个原始类型List - 你甚至可以添加一个Integer声明为List<String>东西,仿制药不会也不能阻止[编辑:使用未经检查的强制转换或拓宽投地原始类型;这将导致(可压缩)编译器警告,但没有错误]。

(*)编辑:我学到了一些新的和指正,某种类型的参数(的实施者GenericDeclarationClassConstructorField和返回,参数和异常类型的Method)会在字节码保留并且可以在运行时使用Field.getGenericType()和类似访问器访问。

+3

对不起,对于泛型类型,这不是真的。 f.getGenericType()返回参数化类型,即:java.util.List slipheed

+2

@Saher是的,不是直接,而是使用未经检查的转换或扩展转换为原始类型'List' )实际上你可以在没有编译器阻止的情况下向任何'Collection'添加任何东西 - 它只会警告,甚至可以被抑制。 –

+0

@slipheed我不知道。但是,难道你不能在你反思的类的'Field'上调用'getGenericType()'吗? –

0
public class X<T extends List> { 
    T field; 
} 

这就是你需要的吗?

0

阅读本教程有关泛型:Generics Tutorial。这应该清除一些事情。

此pdf在通配符使用结束时也有很好的例子,以及扩展ans超级关键字。 PDF Doc

基本上,使用Container<? extends A>当你想要的时候你想要写的容器从容器 UseContainer<? super A>读取。