Ответ
Нет, это запрещено спецификацией Java. Все перечисления (enum) неявно являются финальными (final) классами, наследующимися от java.lang.Enum. Явное наследование от enum или от java.lang.Enum приводит к ошибке компиляции.
Почему это ограничение?
- Безопасность и целостность: Перечисление представляет фиксированный набор значений. Наследование могло бы нарушить эту модель, позволив создавать "под-значения".
- Ожидаемое поведение: Методы
valueOf(),values(), корректная работаswitchи сериализация полагаются на известный на этапе компиляции конечный набор констант.
Пример ошибки:
enum Color { RED, GREEN, BLUE }
// Ошибка компиляции: Cannot inherit from final 'Color'
class MyColor extends Color { }
Что можно делать с Enum? Перечисления могут:
-
Реализовывать интерфейсы — это основной способ расширения функциональности.
interface Drawable { void draw(); } enum Shape implements Drawable { CIRCLE { public void draw() { /* рисовать круг */ } }, SQUARE { public void draw() { /* рисовать квадрат */ } }; } - Содержать поля, методы и конструкторы для создания полноценных объектов-констант.
enum Planet { MERCURY(3.303e+23), VENUS(4.869e+24); private final double mass; Planet(double mass) { this.mass = mass; } public double getMass() { return mass; } }