我有一个arraylist,我需要在运行时指定类型。如何在运行时指定genric类型
ArrayList<String> alist = new ArrayList<String>();
我需要在运行时指定“字符串”类型。我怎样才能做到这一点。 它不应该是静态的。
我有一个arraylist,我需要在运行时指定类型。如何在运行时指定genric类型
ArrayList<String> alist = new ArrayList<String>();
我需要在运行时指定“字符串”类型。我怎样才能做到这一点。 它不应该是静态的。
这是不可能的,因为type erasure - 一个过程,其中编译器删除类或参数内的类型参数和类型参数相关的所有信息。
它只在编译期间可用来检查类型。
编辑:作为解决您的问题的解决方法,您可以使用ArrayList<Object>
这将允许您将任何类型添加到ArrayList。在这种情况下,您可以使用instanceof检查类型并将其转换为具体类型。
你的意思是你想参数化用于创建ArrayList
的类型?
public <T> List<T> interestingMethod(Class<T> type) {
List<T> aList = new ArrayList<T>();
// do something interesting...
return aList;
}
薪火type
参数只需要类型推断,我觉得这个模式的杂牌组装电脑,但它与Java的唯一途径。由于其他人会指出,由于类型擦除,我们没有运行时类型信息和泛型。
泛型类型参数未编译到字节码中,因此在运行时不可用。一个ArrayList < String>在运行时只是一个ArrayList。 您可以实现的最接近的功能是自己添加运行时检查。例如,Collections类提供了一个decorator认为正是这一点:
List l = Collections.checkedList(new ArrayList<String>(), String.class);
l.add("Jave uses erasure");
l.add(14);
如果列表简单地创建为ArrayList的< string>后,两个加法会在运行时取得成功。但是,使用包装器实现时,每个项目添加都会被验证,所以第二个调用将导致ClassCastException。
查看überSkeet's或Darren Gilroy的回答http://stackoverflow.com/questions/1127923/specifying-generic-collection-type-param-at-runtime-java-reflection – 2010-05-12 06:29:36
“我需要指定类型”String“在运行时“ - 基本上你没有,你需要解释你正在试图做更详细的。 – 2010-05-12 07:01:57
我不遵循这个问题。你是否试图在编译时不知道泛型参数的情况下创建'ArrayList <>'?对于静态类型特征没有任何意义(擦除似乎不相关,顺便说一句)。如果封闭的实例或方法定义了一个通用参数,那么这可能是你想要的。 – 2010-05-12 11:58:24