путаница - PullRequest
       1

путаница

6 голосов
/ 08 декабря 2011

Я наткнулся на следующий код Java.Здесь интерфейс содержит два метода, из которых только один метод реализован в перечислении.Написано, что name() реализовано автоматически.Мой вопрос, как это возможно?Я не читал никаких правил, касающихся автоматической реализации метода в enum.Так что здесь происходит?Кроме того, код не дает никакой ошибки времени компиляции.

interface Named {
    public String name();
    public int order();
}

enum Planets implements Named {
    Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune;
    // name() is implemented automagically.
    public int order() { return ordinal()+1; }
}

Ответы [ 5 ]

9 голосов
/ 08 декабря 2011

name() определен в классе Enum, который удовлетворяет вашему контракту интерфейса, поэтому вам не нужно определять name(), если, конечно, вы не хотите переопределить поведение по умолчанию.

6 голосов
/ 08 декабря 2011

enum имеет метод по умолчанию name(), вот и все.

It и другие, такие как values(), valueOf() и ordinal(), происходят из класса Enum .

2 голосов
/ 08 декабря 2011

Все перечисления в Java неявно расширяют Enum , который реализует метод name().

публичное окончательное имя строки ()

Возвращает имя этой константы перечисления, точно так же, как объявлено в объявлении ее перечисления.

1 голос
/ 08 декабря 2011

Каждый enum образован от абстрактного класса Enum<E....>. Этот класс реализует как name(), так и упомянутый ordinal() и некоторые другие. Взгляни.

1 голос
/ 08 декабря 2011

В Java есть атрибуты и методы, которые предварительно определены для типов.Для перечислений метод name() и для массивов атрибут length являются примерами.В вашем примере имя метода () вернет "Меркурий", "Венера", "Земля" и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...