如何使用反射在Java中创建通用参数化类?
我有
public class SomeClass<T> {
public SomeClass<T>() {
}
}
我需要一个实例。
我尝试了各种
Class c = Class.forName("SomeClass");
但找不到允许我获得适当类型实例的语法,例如
SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance();
那么,我怎么能这样做呢?
答案 0 :(得分:7)
Java使用基于擦除的泛型(即,类型参数在运行时被擦除 - 例如,List<Integer>
和List<String>
在运行时被视为相同的类型。由于反射本质上是一个运行时功能,因此根本不使用或不涉及类型参数。
换句话说,当您使用反射时,您只能实例化原始类型(SomeClass
,而不是SomeClass<T>
)。然后,您必须手动将类型转换为通用版本(并生成unchecked
警告)。
答案 1 :(得分:2)
查看/搜索"Type erasure"
。泛型用于编译时,它们在运行时不可用,因此您无法尝试。您需要使用原始类型进行反射
答案 2 :(得分:1)
由于type erasure,在运行时SomeClass
就剩下SomeClass<SomeType>
。