我有一个arraylist,我需要在运行时指定类型。
ArrayList<String> alist = new ArrayList<String>();
我需要在运行时指定类型“String”。我怎样才能做到这一点。 它不应该是静态的。
答案 0 :(得分:5)
由于type erasure而无法实现 - 这是一个编译器删除与类参数相关的所有信息并在类或方法中键入参数的过程。
它仅在编译期间可用,以检查类型。
编辑:作为问题的解决方法,您可以使用ArrayList<Object>
这将允许您向ArrayList添加任何类型。在这种情况下,您可以使用instanceof检查类型并转换为具体类型。
答案 1 :(得分:1)
您的意思是您想要参数化用于创建ArrayList
?
public <T> List<T> interestingMethod(Class<T> type) {
List<T> aList = new ArrayList<T>();
// do something interesting...
return aList;
}
仅在类型推断时才需要传递type
参数,我发现这种模式是一种kludge,但这是Java的唯一方法。
正如其他人都会指出的那样,由于类型擦除,我们没有带有泛型的运行时类型信息。
答案 2 :(得分:1)
泛型类型参数未编译到字节码中,因此在运行时不可用。一个ArrayList&lt; String&gt;在运行时只是一个ArrayList。 您可以实现的最接近的事情是自己添加运行时检查。例如,Collections类提供的decorator就是这样做的:
List l = Collections.checkedList(new ArrayList<String>(), String.class);
l.add("Jave uses erasure");
l.add(14);
如果列表只是作为ArrayList&lt; String&gt;创建,那么这两个添加将在运行时成功。但是,使用包装器实现,每个项目添加都会被验证,因此第二次调用将导致ClassCastException。