2013-09-06 3 views
4

Я смотрел the source code of the Enum class. Это похоже на простой абстрактный класс с защищенным конструктором. Это не окончательно, у него нет специальных аннотаций внутри него, и он не использует собственный код. И все же он не может быть подклассифицирован напрямую. На самом деле, следующий код не компилируется:Что делает класс Enum неприемлемым?

class Foo<E extends Enum<E>> extends Enum<E> { 
    Foo(String name, int ordinal) { 
     super(name, ordinal); 
    } 
} 

Я знаю, что Enum специальный класс в Java, и я понимаю, что есть веские причины, почему прямые подклассы должны быть запрещены. Но технически, как вы применяете это поведение? Может ли программист создать аналогичный не конечный класс, который не допускал бы прямого подкласса, несмотря на наличие доступного конструктора?

ответ

6

Недействительно распространять только Enumна языке. Каждый раз, когда вы объявляете enum, делает создать подкласс Enum.

Способ, которым JLS запрещает вам «вручную» объявлять класс, который расширяет Enum, - это просто запретить его явно. От JLS section 8.1.4:

Это ошибка времени компиляции, если ClassType называет класс Enum или его вызов.

(Где ClassType типа вы расширяете.)

Без этого правила, ваш код был бы вполне допустим.

Смежные вопросы