Получить универсальный тип коллекции без проверки элемента - PullRequest
0 голосов
/ 28 мая 2018

Мне нужно выяснить общий тип 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;
}

Это, с другой стороны, дает мне:

?


В случае, если нет способа использовать отражение,Есть ли какой-нибудь другой хитрый способ получения информации, содержит ли Коллекция какую-либо Коллекцию без извлечения первого элемента?

1 Ответ

0 голосов
/ 28 мая 2018

Нет.Дженерики - это инструмент для более удобной проверки типов при компиляцииОни не существуют во время выполнения.

Во время выполнения Коллекция - это не что иное, как Коллекция без дополнительной информации.Только его содержание описывает, что оно содержит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...