Может ли класс в Java наследоваться от Enum?

«Может ли класс в Java наследоваться от Enum?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, это запрещено спецификацией 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? Перечисления могут:

  1. Реализовывать интерфейсы — это основной способ расширения функциональности.

    interface Drawable { void draw(); }
    
    enum Shape implements Drawable {
        CIRCLE { public void draw() { /* рисовать круг */ } },
        SQUARE { public void draw() { /* рисовать квадрат */ } };
    }
  2. Содержать поля, методы и конструкторы для создания полноценных объектов-констант.
    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; }
    }