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