问题 Java获得泛型类型的集合[重复]


这个问题在这里已有答案:


2605
2017-10-08 16:21


起源

你能展示更多代码吗?目前尚不清楚这里发生了什么。如果方法适用 List,有理由它不会起作用 Collection。 - Rohit Jain
即使你确实获得了该字段的泛型类型,也没有太多可以使用它。你的情况是什么目的? - Sotirios Delimanolis
Rohit Jhon - 代码适用于List但不适用于Collection。在运行时它说Collection不能转换为ParameterizedType(正如我在问题中提到的)。 Sotirious Delimanolis - 这段代码的目的是生成代码,以便了解泛型的类型 - Gumba
@Gumba。你有嵌套的参数化类型吗?就像是 List<Collection<String>>?姓氏是 耆那教不是 JHON。 - Rohit Jain


答案:


你的方法很好。它应该适用于两者 List<String> 和 Collection<String>。例如,请参阅此示例代码:

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

12
2017-10-08 16:35





据我所知,Java完全擦除了类型,因此编译后的代码没有为参数类型赋值的痕迹。所有参数类型都转换为具体类型,包括类型转换和类似的东西

在我到目前为止看到的代码中,当一个类需要知道其泛型类型的值时,它会强制将该类型(或类)的对象作为参数传递。 就像是:

class A<T> {
    private final Class<T> parameterType;

    public A(Class<T> parCls) {
        parameterType = parCls;
    }

    public A(T tObj) {
        parameterType = tObj.getClass();
    }
}

1
2017-10-08 16:32



正如我在我的问题中提到的,我知道java擦除,但我管理(正如你在我的代码中可以看到的)从List类型中获取通用。 - Gumba
这是类型参数,而不是您为其分配的值。 - Giulio Franco


您需要使用它定义的任何类型来解析ParameterizedType。例如,使用 TypeTools

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;

这里的价值 T 在StringFoo中定义,所以我们可以使用 TypeResolver 使用来解析字段类型的原始类 StringFoo


0
2017-10-31 22:31