使用对象实例化集合

时间:2011-06-01 09:04:20

标签: java generics collections

我想做以下事情(这不起作用,只是为了解释这个概念)。知道怎么做吗?

Class type;
if (/* something */)
  type = String.class;
else
  type = Boolean.class;

return new ArrayList<type>();

ArrayList<type>不起作用。我尝试使用type.getClass(),但也无效。

6 个答案:

答案 0 :(得分:5)

将其包装到方法中,将类型作为泛型Class传递,让Java为您完成剩下的工作。无需任何条件分支。

<T> List<T> newList(Class<T> type) {
    return new ArrayList<T>();
}

然后你可以像这样使用它:

List<String> list = newList(String.class);

请记住,不必在泛型类级别指定T。您可以为方法指定泛型类型,因此可以将其作为示例代码中的泛型方法

答案 1 :(得分:3)

你做不到。您的检查在运行时发生,编译后泛型丢失。

泛型的唯一目的是在编译时保证类型安全。在您的示例中,您希望在运行时确定类型。

您可以做的是在每个if中实例化一个不同类型的集合。

答案 2 :(得分:2)

你应该使用:

public ArrayList<?> getList() {
    if (/* something */) {
        return new ArrayList<String>();
    } else {
        return new ArrayList<Boolean>();
    }
}

答案 3 :(得分:1)

Java编译器删除类型信息,但可以通过this one

等其他包访问

答案 4 :(得分:0)

type不是class,在这种情况下您可以有多次返回 你可以拥有这个

public <T> List<T> foo(T type) {
    return new ArrayList<T>();
}

答案 5 :(得分:0)

if子句可能是在运行时决定的。 java中的参数化类型在编译时被清除。只返回新的ArrayList()将产生相同的效果。