Мне нужно выяснить общий тип Collection<?>
.Единственным ограничением является то, что я не могу удалить первый элемент (если он есть) из-за моего механизма кэширования - поэтому я не могу выполнить следующее, потому что он фактически получает первое значение:
collection.iterator().next().getClass();
Моя цель - определить, содержит ли Collection<?>
какую-либо другую коллекцию внутри, например, квалифицировано Collection<List<List<String>>>
, в то время как Коллекция нет.Я получаю это 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>>
следующий:
E
Еще одна моя попытка была получить его из заявленных полей.
@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;
}
Это, с другой стороны, дает мне:
?
В случае, если нет способа использовать отражение,Есть ли какой-нибудь другой хитрый способ получения информации, содержит ли Коллекция какую-либо Коллекцию без извлечения первого элемента?