EDIT2: Обобщения на суперклассах и интерфейсах не стираются. Вы можете получить универсальный тип во время выполнения и использовать его для получения значений перечисления. Смотрите Class.getGenericSuperclass. Это избавит вас от необходимости передавать значение или класс в конструкторе.
Оригинал:
Вы не можете сделать это с генериками. Однако, если вы переходите в соответствующий класс, например, конструктор типа
AbstractParent(Class<E> enumClass)
{
this.enumClass = enumClass;
}
Затем вы можете использовать это для получения соответствующих значений перечисления через
public E[] getValues()
{
return this.enumClass.getEnumConstants();
}
РЕДАКТИРОВАТЬ: Хотя клиенты не являются профессиональными программистами, компилятор будет гарантировать, что правильный класс передается. Вы также можете прояснить использование, предоставив примеры и модульные тесты.
Вы также можете получить конструктор и реальное значение Enum и извлечь класс из этого. Это может быть проще в использовании, так как параметр тогда будет E
, а не более "страшным" Class<E>
.
Е.Г.
AbstractParent(E enumValue)
{
this.enumClass = enumValue.getClass();
}