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

时间:2011-06-16 14:45:01

标签: java generics reflection parameterized

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

我有

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

我需要一个实例。

我尝试了各种

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

但找不到允许我获得适当类型实例的语法,例如

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

那么,我怎么能这样做呢?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

由于type erasure,在运行时SomeClass就剩下SomeClass<SomeType>