Как получить объект типа обобщенного Enum? например: EnumSet.noneOf (<huh?>) - PullRequest
0 голосов
/ 03 марта 2009

У меня есть универсальный тип, который параметризован в некотором Enum, объявленном так:

public class FlagsField<T extends Enum<T>> {

    private EnumSet<T> _flagSet;

    public FlagsField() {
        _flagSet = EnumSet.<T>noneOf( /* what goes here? */ );
    }

    ...
}

Я хочу инициализировать _flagsField в конструкторе, как указано выше, но пока не могу понять, какой параметр является правильным для метода noneOf. Это должно быть типа Class<T>. Если бы это не был универсальный, вы бы использовали MyFooEnumType.class здесь, но T.class недопустимо.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 03 марта 2009

Вы столкнулись с стиранием типа . Ваш конструктор должен выглядеть следующим образом:

public FlagsField(Class<T> enumClass) {
    _flagSet = EnumSet.<T>noneOf(enumClass);
}
2 голосов
/ 08 марта 2009

Вы можете использовать этот трюк в своем конструкторе: (см. Общие объекты доступа к данным , раздел «Подготовка DAO с поиском»)

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

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

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