使用反射在Java中创建通用参数化类 [英] Use reflection to create a generic parameterized class in Java
问题描述
如何使用反射在Java中创建泛型参数化类?
我有
public class SomeClass< T> {
public SomeClass< T>(){
}
}
<
我尝试了
Class c = Class.forName(SomeClass);
但是找不到一个语法来让我得到一个适当类型的实例,比如
SomeType instance =(SomeType)Class.forName(SomeClass< SomeType>)。createInstance();
所以,我怎么能这样做?
List< String>
在运行时被视为相同类型)。因为反射本质上是一个运行时功能,所以类型参数根本不被使用或涉及。 换句话说,你只能实例化原始类型( SomeClass
,而不是 SomeClass< T>
)。然后您必须手动将该类型转换为通用版本(并生成未经检查的
警告)。
How can I use reflection to create a generic parameterized class in Java?
I have
public class SomeClass<T> {
public SomeClass<T>() {
}
}
and I need an instance of it.
I've tried variations of
Class c = Class.forName("SomeClass");
but could not find a syntax that would allow me to get an appropriately typed instance, like, say
SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance();
So, how could I go about doing this?
Java uses erasure-based generics (i.e., the type parameters are erased at runtime—for example, List<Integer>
and List<String>
are treated as the same type at runtime). Since reflection is inherently a runtime feature, the type parameters are not used or involved at all.
In other words, you can only instantiate the raw type (SomeClass
, not SomeClass<T>
) when you're using reflection. You will then have to manually cast the type to the generic version (and generate an unchecked
warning).
这篇关于使用反射在Java中创建通用参数化类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!