是否有可能获得Class <somegenericclass <sometype>&gt; </somegenericclass <sometype>的实例

时间:2012-05-16 09:49:32

标签: java generics

是否可以获得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>();

我知道这段代码很难看,我不应该这样做。但我们在哪里......

4 个答案:

答案 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