如何将泛型列表类作为参数传递给Java中的泛型方法?

时间:2016-04-30 05:58:37

标签: java generics

我希望有一个方法可以返回从地图中提取的所需对象类型。 这是一个例子

Map<String,Object> map = new HashMap<>();
map.put("ids", Arrays.asList(5,345,45645)); 
map.put("id", 325); 

<T> T get(String arg, Class<T> clazz) {
    return (T) map.get(arg);
}

然后,例如,可以使用此代码获取Integer

Integer id = get("id", Integer.class);

但是当我试图以这些方式获取对象列表时

List<Integer> ids = get("ids", new ArrayList<Integer>().getClass());
List<Integer> ids = get("id", List.class);

Intellij IDEA警告:Unchecked assignment: 'java.util.ArrayList' to 'java.util.List<java.lang.Integer>'

我期待List<Integer>.class之类的东西(类似于Integer.classBoolean.class等......)将用作什么

List<Integer> ids = get("ids", List<Integer>.class`)

但这不是编译的。

那么有解决方案吗?

1 个答案:

答案 0 :(得分:2)

您实际上并不需要Class参数。

<T> T unsafeGet(String arg) {
    return (T) map.get(arg);
}

我重命名了该方法,因为您丢弃所有编译器类型检查

这两行编译,但在运行时失败:

Integer ids = unsafeGet("ids"); // java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer
Element id = unsafeGet("id");   // java.lang.ClassCastException: java.lang.Integer cannot be cast to org.w3c.dom.Element