Java获取集合的泛型类型
我的项目包括反射,目前我正在处理泛型类型。 我已通过以下方法从列表(java.util.List)中获取了泛型类型:Java获取集合的泛型类型,java,generics,reflection,Java,Generics,Reflection,我的项目包括反射,目前我正在处理泛型类型。 我已通过以下方法从列表(java.util.List)中获取了泛型类型: 然后当我面对一些列表字段时,使用上面的代码,我得到字符串作为子类变量 据我所知,Java完全擦除了类型,因此编译后的代码没有您分配给参数类型的值的痕迹。所有参数化类型都转换为具体类型,包括类型铸件等 在我到目前为止看到的代码中,当类需要知道其泛型类型的值时,它会强制将该类型(或类)的对象作为参数传递。 比如: class A<T> { private fina
然后当我面对一些
列表
字段时,使用上面的代码,我得到字符串
作为子类变量 据我所知,Java完全擦除了类型,因此编译后的代码没有您分配给参数类型的值的痕迹。所有参数化类型都转换为具体类型,包括类型铸件等
在我到目前为止看到的代码中,当类需要知道其泛型类型的值时,它会强制将该类型(或类)的对象作为参数传递。
比如:
class A<T> {
private final Class<T> parameterType;
public A(Class<T> parCls) {
parameterType = parCls;
}
public A(T tObj) {
parameterType = tObj.getClass();
}
}
A类{
私有final类参数type;
公共A类(类包裹){
参数类型=地块;
}
公共A(T tObj){
parameterType=tObj.getClass();
}
}
你的方法很好。它应该适用于列表
和集合
。例如,请参见以下示例代码:
public class Demo {
List<String> list = new ArrayList<>();
Collection<String> coll = new ArrayList<>();
public static void main(String args[]){
Class<Demo> clazz = Demo.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType)type;
Type[] arr = pType.getActualTypeArguments();
for (Type tp: arr) {
Class<?> clzz = (Class<?>)tp;
System.out.println(clzz.getName());
}
}
}
}
}
您需要使用在其上定义的任何类型解析ParameteredType。例如,使用:
class-Foo{
公共酒吧;
}
类StringFoo扩展了Foo{}
类型barType=Foo.class.getDeclaredField(“bar”).getGenericType();
Class t=TypeResolver.resolveRawClass(barType,StringFoo.Class);
断言t==String.class;
这里,
T
的值是在StringFoo中定义的,因此我们可以使用TypeResolver
来解析字段类型的原始类,使用StringFoo
可以显示更多的代码吗。现在还不清楚这里发生了什么。如果该方法适用于列表
,那么它就有理由不适用于集合
。即使您获得了字段的泛型类型,您也无能为力。你的目的是什么?Rohit Jhon-该代码适用于列表,但不适用于收集。在运行时,它说集合不能转换为ParameterizedType(正如我在问题中提到的)。Sotirious Delimanolis-此代码的目的是生成代码,以便确定generic@Gumba. 是否有嵌套的参数化类型?类似于列表
?姓氏是Jain,不是Jhon。正如我在问题中提到的,我知道java擦除,但我设法(正如你在代码中看到的)从列表类型中获取泛型。这是类型参数,不是你分配给它的值。不是所有类型都是类的实例。强制转换可能会引发异常。
class A<T> {
private final Class<T> parameterType;
public A(Class<T> parCls) {
parameterType = parCls;
}
public A(T tObj) {
parameterType = tObj.getClass();
}
}
public class Demo {
List<String> list = new ArrayList<>();
Collection<String> coll = new ArrayList<>();
public static void main(String args[]){
Class<Demo> clazz = Demo.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType)type;
Type[] arr = pType.getActualTypeArguments();
for (Type tp: arr) {
Class<?> clzz = (Class<?>)tp;
System.out.println(clzz.getName());
}
}
}
}
}
java.lang.String
java.lang.String
class Foo<T> {
public T bar;
}
class StringFoo extends Foo<String> {}
Type barType = Foo.class.getDeclaredField("bar").getGenericType();
Class<?> t = TypeResolver.resolveRawClass(barType, StringFoo.class);
assert t == String.class;