class.forName可以接受泛型参数吗?这看起来不太可能,因为java确实进行了类型擦除,所以没有泛型类型信息。在运行时可用。
如果是这样,如果我传递泛型参数,会有什么行为呢?它会抛出吗?
我想要使用一个自定义的比较器类
Comparator<String[]>
并实例化它。重写它的最安全的类型方法是什么?我可以避免
Comparator<String[]>
演员阵容吗?
this.keyComparer =
(Comparator<String[]>) Class.forName(comparatorClass).asSubclass(
Class.forName("Comparator<String[]>")
).newInstance();
发布于 2011-01-28 20:05:34
你试过了吗?我想,不是,因为:
Class.forName("java.util.List<String>");
引发预期的运行时异常。
这是意料之中的,因为javaDoc说:
调用forName("X")会初始化名为X的类。
并且java.util.List<String>
不是一个类名。(它包含类名,但它是其他名称)
发布于 2011-01-28 20:00:13
为了通过反射创建newInstance()
,您应该执行以下操作:
Class<ArrayList<String>> list = (Class<ArrayList<String>>)
Class.forName("java.util.ArrayList");
ArrayList<String> l = list.newInstance();
现在你可以初始化了。您的比较器类就是这样
有关更多信息,请查看Java Generics FAQ
https://stackoverflow.com/questions/4827910
复制相似问题