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

使用反射在Java中创建泛型参数化类,java,generics,reflection,parameterized,Java,Generics,Reflection,Parameterized,如何使用反射在Java中创建泛型参数化类 我有 public class SomeClass<T> { public SomeClass<T>() { } } 但是找不到一种语法,可以让我得到一个适当类型的实例,比如 SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance(); SomeType实例=(SomeType)Class.for

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

我有

public class SomeClass<T> {
   public SomeClass<T>() {
   }
}
但是找不到一种语法,可以让我得到一个适当类型的实例,比如

SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance();
SomeType实例=(SomeType)Class.forName(“SomeClass”).createInstance();

那么,我该怎么做呢?

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


换句话说,当您使用反射时,您只能实例化原始类型(
SomeClass
,而不是
SomeClass
)。然后,您必须手动将类型强制转换为通用版本(并生成未选中的
警告)。

请参阅/搜索
“类型擦除”
。泛型用于编译时,它们在运行时不可用,所以您尝试的是不可能的。您需要使用原始类型进行反射

,因为在运行时,
SomeClass
只剩下
SomeClass

我无法手动将该类型强制转换为泛型版本,因为我只知道该类型的字符串名称。这就是为什么我需要一种方法来获得一个正确类型的实例,而不需要知道更多类型的名称作为字符串。@Luviere:然后在源代码中使用
SomeClass
。类型参数只在编译时有用,而且由于您在编译时没有这些信息,
是表达这一点的方式。SomeClass的行为与SomeClass完全不同。使用SomeClass如何解决这个问题?@Luviere:在Java中,运行时
SomeClass
SomeClass
的类型相同:两者都是
SomeClass
类型。这就是为什么与在C#中相比,在Java中使用类型参数可以做的事情非常有限。(Java==擦除泛型,即在运行时丢失的类型参数。C#==具体化泛型,即在运行时保留的类型参数。)我成功地重写了代码,不再依赖于类型的名称,现在,实例化确实可以轻松地工作。
SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance();