获取泛型类型的Collection而不检查元素

时间:2018-05-27 21:31:27

标签: java generics reflection

我需要找出Collection<?>的泛型类型。唯一的限制是,由于我的缓存机制,我无法撤回第一个元素(如果它包含任何元素) - 因此我无法执行以下操作,因为它实际上获得了第一个值:

collection.iterator().next().getClass();

我的目标是确定Collection<?>是否包含任何其他集合,例如Collection<List<List<String>>>是合格的,而Collection不是。我从作为参数传递的方法调用中收到此Collection<?>。我尝试过以下方法:

@Override
public Collection<?> execute(Collection<?> collection) {
    Class<?> clazz = collection.getClass();
    Type genericSuperClass = clazz.getGenericSuperclass();
    ParameterizedType parametrizedType = (ParameterizedType) genericSuperClass;
    Type[] typeArguments = parametrizedType.getActualTypeArguments();
    String clazzName = typeArguments[0].toString();

    // ... irrelevant code
    return null;
}

可悲的是String clazzName的结果而不是java.util.List<java.util.List<java.lang.Integer>>以下内容:

  

电子

我的另一个尝试是从声明的字段中获取它。

@Override
public Collection<?> execute(Collection<?> collection) {
    this.collection= collection;
    try {               
        Field field = Foo.class.getDeclaredField("collection");
        ParameterizedType parametrizedType = (ParameterizedType) field.getGenericType();
        Type type = parametrizedType .getActualTypeArguments()[0];
    } catch ( SecurityException | NoSuchFieldException e) { ... }

    // ... irrelevant code
    return null;
}

另一方面,这给了我:

  

如果没有办法使用反射,是否有任何其他棘手的方法来获取信息,Collection是否包含任何Collection而不检出第一个元素?

1 个答案:

答案 0 :(得分:1)

没有。泛型是一种在编译时使类型检查更有用的工具。它们在运行时不存在。

在运行时,一个Collection&lt; whatever&gt;没有进一步的信息,只不过是一个集合。只有它的内容描述了它包含的内容。