Java 在不签出元素的情况下获取集合的泛型类型

Java 在不签出元素的情况下获取集合的泛型类型,java,generics,reflection,Java,Generics,Reflection,我需要找出集合的泛型类型。唯一的限制是,由于我的缓存机制,如果第一个元素包含任何元素,我就不能提取它-因此我不能执行以下操作,因为它实际上获取第一个值: collection.iterator().next().getClass(); 我的目标是确定集合中是否包含任何其他集合,例如集合是合格的,而集合不是。我从作为参数传递的方法调用接收此集合。我尝试了以下方法: @Override public Collection<?> execute(Collection<?> c

我需要找出集合的泛型类型。唯一的限制是,由于我的缓存机制,如果第一个元素包含任何元素,我就不能提取它-因此我不能执行以下操作,因为它实际上获取第一个值:

collection.iterator().next().getClass();
我的目标是确定集合中是否包含任何其他集合,例如集合是合格的,而集合不是。我从作为参数传递的方法调用接收此集合。我尝试了以下方法:

@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;
}
另一方面,这给了我:

?


在无法使用反射的情况下,是否有其他棘手的方法来获取信息,即集合是否包含任何集合而不签出第一个元素?

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


在运行时,集合只不过是没有进一步信息的集合。只有它的内容描述了它所包含的内容。

你根本不能。如果它是泛型类的非泛型扩展,例如类MyCollection extends Collection,则可以。但除此之外,没有。@AndyTurner:而且很难做到:我说不能,不能。也许这不是一个容易翻译的成语,但我的意思是你不能。@AndyTurner:哦,我明白了。我错了,我不是以英语为母语的人。谢谢。我保证你的英语比我的捷克语好。
@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;
}