我需要找出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而不检出第一个元素?
答案 0 :(得分:1)
没有。泛型是一种在编译时使类型检查更有用的工具。它们在运行时不存在。
在运行时,一个Collection&lt; whatever&gt;没有进一步的信息,只不过是一个集合。只有它的内容描述了它包含的内容。