1

是否有可能获得一个实例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

4 回答 4

1

如果要实例化Class<SomeGenericClass<SomeType>>

Class<List<Object>> list = (Class<List<Object>>)(Class<?>)List.class;

Type genericclass = new ArrayList<Object>() {}.getClass().getGenericSuperclass();
于 2012-05-16T09:55:14.940 回答
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);

因此,不是将类型作为参数传递,而是将其作为类型参数传递。

于 2012-05-16T10:11:25.370 回答
0

这满足您的“无实例”标准,编译并运行正常:

Class<ArrayList<String>> c =
    (Class<ArrayList<String>>) Class.forName("java.util.ArrayList");

这是由于类型擦除而起作用的:在运行时,ArrayList<String>is just ArrayList,并且进一步Class<ArrayList<String>>is just Class

于 2012-05-16T18:46:53.913 回答
0

由于 Java 泛型中的类型擦除,对“List<String>”实例调用“getClass”的结果会丢失类型参数“String”,换句话说,可能无法获取“Class<List<String>>” . 但是你可以在 Scala 中做到这一点:

scala> List("foo", "bar").getClass
res0: java.lang.Class[_ <: List[java.lang.String]] = class scala.collection.immutable.$colon$colon
于 2012-05-16T10:04:38.710 回答