具有Class.forName的泛型和asSubClass

时间:2011-01-28 11:54:35

标签: java generics

class.forName可以采用通用参数吗?鉴于java确实键入了擦除,因此看起来不太可能,因此没有泛型类型信息。在运行时可用。

如果是这样,如果我传递泛型参数会有什么行为?它扔了吗?

我想采用类型为

的自定义比较器类
Comparator<String[]> 

并实例化它。什么是最安全的重写方式?我可以避免

Comparator<String[]> 
什么都投了?

this.keyComparer =
(Comparator<String[]>) Class.forName(comparatorClass).asSubclass(
      Class.forName("Comparator<String[]>")
 ).newInstance();

2 个答案:

答案 0 :(得分:4)

你尝试过吗?我想,不,因为:

 Class.forName("java.util.List<String>");

抛出预期的运行时异常。

这是预期的,因为javaDoc说:

  

对forName(“X”)的调用会导致名为X的类被初始化。

java.util.List<String>不是班级名称。 (它包含一个类名,但其他东西)

答案 1 :(得分:2)

要通过反思创建newInstance(),您应该这样做:

Class<ArrayList<String>> list = (Class<ArrayList<String>>)
                                Class.forName("java.util.ArrayList");
ArrayList<String> l = list.newInstance();

现在你可以初始化了。你的比较器类

有关详细信息,请查看Java Generics FAQ