我想做以下事情(这不起作用,只是为了解释这个概念)。知道怎么做吗?
Class type;
if (/* something */)
type = String.class;
else
type = Boolean.class;
return new ArrayList<type>();
ArrayList<type>
不起作用。我尝试使用type.getClass()
,但也无效。
答案 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()将产生相同的效果。