Почему супер конструктор не может быть вызван из конструктора enum? - PullRequest
9 голосов
/ 24 декабря 2010
public enum A {
     A(1);

     private A(int i){
     }

     private A(){
         super(); // compile - error
             // Cannot invoke super constructor from enum constructor A()
     }

}

и здесь иерархия enum A простирается от abstract java.lang.Enum простирается java.lang.Object

Class c = Class.forName("/*path*/.A");
System.out.println(c.getSuperclass().getName());
System.out.println(Modifier.toString(c.getSuperclass().getModifiers()).contains("abstract"));
System.out.println(c.getSuperclass().getSuperclass().getName());

Ответы [ 4 ]

9 голосов
/ 24 декабря 2010

Перечисления подразумевают много волшебства на уровне компилятора и среды выполнения, чтобы гарантировать, что == сравнения всегда будут работать:

Ошибка времени компиляции при попытке явно создать экземпляр типа перечисления (§15.9.1).Последний метод клонирования в Enum гарантирует, что константы enum никогда не могут быть клонированы, а специальная обработка механизмом сериализации гарантирует, что повторяющиеся экземпляры никогда не будут созданы в результате десериализации.Рефлексивная реализация типов перечислений запрещена.Вместе эти четыре вещи гарантируют, что не существует ни одного экземпляра типа enum, кроме тех, которые определены константами enum.

Спецификация языка Java section 8.9

Нет конструктора Enum () без параметров, только Enum (String name, int ordinal).Но разрешение вызвать его с неправильными параметрами, очевидно, вызовет проблемы.

7 голосов
/ 24 декабря 2010

Из Java Tutorial по перечислениям:

Все перечисления неявно расширяют java.lang.Enum.Поскольку Java не поддерживает множественное наследование, перечисление не может расширять что-либо еще.

Вы не можете вызвать конструктор super(), поскольку компилятор автоматически вставляет скрытый вызов super(name, ordinal) в любой конструкторопределить.

1 голос
/ 24 декабря 2010

Поскольку не существует конструктора super (), см. Ответ на dogbane, а компилятор автоматически вставляет требуемый вызов super (...), то же самое.

Почему это проблема?

1 голос
/ 24 декабря 2010

Это факт, что вы не можете объявить enum как расширение другого класса. Следовательно, существует только один возможный конструктор super для enum.

Я полагаю, поскольку, поскольку вы не можете соединиться с чем-либо кроме super(), они решили, что вообще не стоит разрешать использование super в конструкторе enum.

В любом случае, вы ничего не теряете.

...