How can I learn actual type argument of an generic class? [duplicate]

7
задан styler1972 16 June 2014 в 15:58
поделиться

4 ответа

Это можно сделать, но стирание типа может сделать это очень сложно. Как обсуждают другие ответы, вам нужно либо создать подкласс ParameterizedClass , либо добавить поле типа T в ParameterizedClass и код отражения, который вам нужен делать это запутанно.

В этих обстоятельствах я рекомендую обойти проблему следующим образом:

class ParameterizedClass<T> {
    private Class<T> type;

    /** Factory method */
    public static <T> ParameterizedClass<T> of(Class<T> type) {
        return new ParameterizedClass<T>(type);
    }

    /** Private constructor; use the factory method instead */
    private ParameterizedClass(Class<T> type) {
        this.type = type;
    }

    // Do something useful with type
}

Благодаря логическому выводу типа Java для статических методов, вы можете создать свой класс без излишних шаблонов:

ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class);

Таким образом, ваш ParameterizedClass является полностью универсальным и типобезопасным, и у вас по-прежнему есть доступ к объекту класса.

РЕДАКТИРОВАТЬ : обратился к комментарию

11
ответ дан 6 December 2019 в 08:13
поделиться

Вы можете использовать этот трюк в вашем конструкторе: (см. http://www.hibernate.org/328.html)

Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Но я полагаю, что этот код работает только тогда, когда класс является подклассом и экземпляр подкласса выполняет его.

8
ответ дан 6 December 2019 в 08:13
поделиться

Это в основном проблемная тема, поскольку она работает только при определенных условиях, например ожидаемых (особенно в сложных сценариях).

Но Ксебия опубликовала хорошую статью в целом.

0
ответ дан 6 December 2019 в 08:13
поделиться

Если вы имеете в виду только от самого объекта, вы не можете. Стирание типа означает потерю информации.

Если у вас есть поле , которое использует параметризованный тип с конкретным аргументом типа, эта информация сохраняется.

См. Часто задаваемые вопросы по обобщениям Анжелики Лангер , и особенно раздел , посвященный стиранию типов .

3
ответ дан 6 December 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: