是否可以获得Class<SomeGenericClass<SomeType>>
?
例如,Class<ArrayList<String>>
的实例没有实例化ArrayList<String>
的实例。
@SuppressWarnings("unchecked")
public static <T> T castToGeneric(Object objectToCast, T typeInferrenceClass) {
return (T)objectToCast;
}
// usage
Object someObject = null /* initialised elsewhere */;
List<String> listOfStrings = castToGeneric(someObject, new ArrayList<String>());
// I want to avoid having to create - new ArrayList<String>();
我知道这段代码很难看,我不应该这样做。但我们在哪里......
答案 0 :(得分:1)
如果想要实例化Class<SomeGenericClass<SomeType>>
Class<List<Object>> list = (Class<List<Object>>)(Class<?>)List.class;
Type genericclass = new ArrayList<Object>() {}.getClass().getGenericSuperclass();
答案 1 :(得分:1)
我找到了解决问题的方法:
@SuppressWarnings("unchecked")
public static <T> T castToGeneric(Object objectToCast) {
return (T)objectToCast;
}
// usage
Object someObject = null /* initialised elsewhere */;
Class<ArrayList<String>> listOfStrings = <Class<ArrayList<String>>>castToGeneric(someObject);
因此,不是将类型作为参数传递,而是将其作为类型参数传递。
答案 2 :(得分:0)
由于Java泛型中的类型擦除,在“List&lt; String&gt;”实例上调用“getClass”的结果将丢失类型参数“String”,换句话说,可能无法获得“Class&lt; List&lt; String&gt ;&gt;”中。但你可以在Scala中做到这一点:
scala> List("foo", "bar").getClass
res0: java.lang.Class[_ <: List[java.lang.String]] = class scala.collection.immutable.$colon$colon
答案 3 :(得分:0)
这符合您的“无实例”标准,编译并运行OK:
Class<ArrayList<String>> c =
(Class<ArrayList<String>>) Class.forName("java.util.ArrayList");
这可以归因于类型擦除:在运行时,ArrayList<String>
只是ArrayList
,而Class<ArrayList<String>>
只是Class
。