通过Reflection在Java中填充List项

时间:2011-03-22 14:41:59

标签: java reflection

我必须使用String格式的值填充对象,并且我有转换器将String值转换为所需的任何值。但是我如何知道列表项的类型?是List<String>还是List<Integer>

4 个答案:

答案 0 :(得分:2)

Java泛型是编译时功能,List&lt; String&gt;和列表&lt;整数&gt;在运行时是相同的。因此,您无法在运行时知道Collection的组件类型。

这类问题问了很多次,有一种方法可以在运行时获取Collection的组件类型,但是你可以扩展一个集合类,在构造它时,你可以给构造函数赋予组件类,通过这种方式你可以在运行时获取组件类型的集合。这是一个示例;

class GenericList<T> extends ArrayList<T> {
private Class<T> componentClasz;

public GenericList(Class<T> clasz){
    super();
    componentClasz = clasz;
}

public Class<T> getComponentClasz() {
    return componentClasz;
}

}

GenericList<String> list = new GenericList<String>(String.class);

答案 1 :(得分:2)

根据您的使用情况,您可以通过几种不同的方法获得List的通用类型。

This post显示了如何为return types方法,parameters方法和field variables

执行此操作
  

运行时检查a   可参数化类型本身,如   java.util.List,没有办法   知道什么类型   参数化为。这是有道理的   因为类型可以参数化   各种类型相同   应用。但是,当你检查   声明使用的方法或字段   参数化类型,你可以看到   在运行时什么类型的可参数化   type被参数化为。

如果不是这三种情况之一,则由于type erasure而无法获得通用类型。

答案 2 :(得分:1)

列表编制时,列表的类型被删除。

此外,字符串不能仅仅被“转换”为任意值。例如转换失败,“hello”的适当Integer值是什么?

如果您想要一个可以容纳任何Java对象的列表,请使用List&lt; Object&gt;。

答案 3 :(得分:0)

您必须检查列表的对象,而不是列表本身。因为Java使用类型安全擦除而不是具体化,所以无法反映列表的通用类型(或任何其他Java集合)。