我想知道是否有办法做这样的事情:
Class clazz = Class.forname("java.lang.String");
GenericClass <clazz> generic = new GenericClass <clazz>();
将类放入泛型类参数中。
答案 0 :(得分:2)
没有。泛型在编译时进行评估,而代码将在运行时稍后运行。
答案 1 :(得分:1)
不,没有。
但是,如果您知道自己在做什么,那么您就不必严格需要通用参数。您可以使用原始类型:
GenericClass generic = new GenericClass();
Java使用&#34; erasure&#34;实现泛型 - 这意味着如果你编写像List<String> l = new ArrayList<String>();
这样的东西,编译器会检查你是否从未尝试将任何不是字符串的东西放入其中,但它会丢弃(擦除)泛型并将其转换为List l = new ArrayList();
。
由于GenericClass<Anything>
实际上只是一个GenericClass
,因此您可以直接使用GenericClass
。无论何时使用它都会得到编译器警告,你必须格外小心,只给它正确的对象,但有时候是必要的。
答案 2 :(得分:0)
根据您的目的,您可以使用其他通用方法解决您的具体问题。例如,此方法创建一个List
,其中包含给定Class
的实例:
<T> List<T> createListOf(Class<T> clazz) {
List<T> result = new ArrayList<T>();
result.add(clazz.newInstance());
return result;
}
然后可以像这样调用它,而不知道实际的类型:
Class<?> unknownClass = Class.forName(unknownString);
List<?> listOfUnknownClass = createListOf(unknownClass);
(没有更多信息,我无法使这个答案更具体针对您的特定问题)