8

如何使用反射在 Java 中创建泛型参数化类?

我有

public class SomeClass<T> {
   public SomeClass<T>() {
   }
}

我需要它的一个实例。

我已经尝试过

Class c = Class.forName("SomeClass");

但找不到可以让我获得适当类型的实例的语法,例如

SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance();

那么,我该怎么做呢?

4

3 回答 3

8

Java 使用基于擦除的泛型(例如,类型参数在运行时被擦除——例如,在运行时List<Integer>List<String>视为相同的类型)。由于反射本质上是一种运行时特性,因此根本不使用或涉及类型参数。

换句话说,您只能在使用反射时实例化原始类型(SomeClass而不是)。SomeClass<T>然后,您必须手动将类型转换为通用版本(并生成unchecked警告)。

于 2011-06-16T14:48:28.057 回答
2

查看/搜索"Type erasure". 泛型用于编译时,它们在运行时不可用,因此您尝试的操作是不可能的。您需要使用原始类型进行反射

于 2011-06-16T14:49:20.970 回答
1

由于类型擦除,在运行时SomeClass只剩下SomeClass<SomeType>.

于 2011-06-16T14:50:21.597 回答