Java获取集合的泛型类型

Java获取集合的泛型类型,java,generics,reflection,Java,Generics,Reflection,我的项目包括反射,目前我正在处理泛型类型。 我已通过以下方法从列表(java.util.List)中获取了泛型类型: 然后当我面对一些列表字段时,使用上面的代码,我得到字符串作为子类变量 据我所知,Java完全擦除了类型,因此编译后的代码没有您分配给参数类型的值的痕迹。所有参数化类型都转换为具体类型,包括类型铸件等 在我到目前为止看到的代码中,当类需要知道其泛型类型的值时,它会强制将该类型(或类)的对象作为参数传递。 比如: class A<T> { private fina

我的项目包括反射,目前我正在处理泛型类型。 我已通过以下方法从列表(java.util.List)中获取了泛型类型:


然后当我面对一些
列表
字段时,使用上面的代码,我得到
字符串
作为子类变量

据我所知,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;