2010-05-12 26 views
1

我有一个arraylist,我需要在运行时指定类型。如何在运行时指定genric类型

ArrayList<String> alist = new ArrayList<String>(); 

我需要在运行时指定“字符串”类型。我怎样才能做到这一点。 它不应该是静态的。

+1

查看überSkeet's或Darren Gilroy的回答http://stackoverflow.com/questions/1127923/specifying-generic-collection-type-param-at-runtime-java-reflection – 2010-05-12 06:29:36

+0

“我需要指定类型”String“在运行时“ - 基本上你没有,你需要解释你正在试图做更详细的。 – 2010-05-12 07:01:57

+0

我不遵循这个问题。你是否试图在编译时不知道泛型参数的情况下创建'ArrayList <>'?对于静态类型特征没有任何意义(擦除似乎不相关,顺便说一句)。如果封闭的实例或方法定义了一个通用参数,那么这可能是你想要的。 – 2010-05-12 11:58:24

回答

5

这是不可能的,因为type erasure - 一个过程,其中编译器删除类或参数内的类型参数和类型参数相关的所有信息。

它只在编译期间可用来检查类型。

编辑:作为解决您的问题的解决方法,您可以使用ArrayList<Object>这将允许您将任何类型添加到ArrayList。在这种情况下,您可以使用instanceof检查类型并将其转换为具体类型。

1

你的意思是你想参数化用于创建ArrayList的类型?

public <T> List<T> interestingMethod(Class<T> type) { 
    List<T> aList = new ArrayList<T>(); 
    // do something interesting... 
    return aList; 
} 

薪火type参数只需要类型推断,我觉得这个模式的杂牌组装电脑,但它与Java的唯一途径。由于其他人会指出,由于类型擦除,我们没有运行时类型信息和泛型。

+0

这是什么语法的意思:'公众列表有趣的方法(类类型)'?我以前没有遇到过单独的类型参数(第一个“”)。 – Eric 2010-05-12 06:52:09

+0

这是因为该方法是通用的,但它所属的类不是通用的。在这种情况下,我们需要声明泛型类型(以及对其的任何约束,如扩展或超级)。 – SteveD 2010-05-12 06:56:55

1

泛型类型参数未编译到字节码中,因此在运行时不可用。一个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。

相关问题