Статические методы в интерфейсе java

Насколько я знаю, вы не можете объявлять статические методы в корпусе интерфейса. Однако случайно я нашел свой собственный код на http://docs.oracle.com/ сайте. Вот ссылка

Namelly

public interface TimeClient 
{
void setTime(int hour, int minute, int second);
void setDate(int day, int month, int year);
void setDateAndTime(int day, int month, int year,
                           int hour, int minute, int second);
LocalDateTime getLocalDateTime();

static ZoneId getZoneId (String zoneString) {
    try {
        return ZoneId.of(zoneString);
    } catch (DateTimeException e) {
        System.err.println("Invalid time zone: " + zoneString +
            "; using default time zone instead.");
        return ZoneId.systemDefault();
    }
}

default ZonedDateTime getZonedDateTime(String zoneString) {
    return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }
}

этот interface имеет метод static getZoneId

Я потерял... может кто-нибудь объяснить пожалуйста

Ответ 2

Вы являетесь свидетелем двух новых функций в Java 8 здесь:

  • статические методы в интерфейсах,
  • методы виртуального расширения.

В примере кода, который вы указываете, getZoneId() иллюстрирует первую новинку, а .getZoneDateTime() - вторую.

Вторым, в частности, является то, что позволило расширить интерфейс Collection с дополнительными методами, такими как .stream(), например, без нарушения обратной совместимости. См. здесь для иллюстрации.

Первый позволяет избежать написания классов "меток мешков", которые часто существуют только для предоставления устаревших статических методов по интерфейсам. Одним из таких примеров может быть Guava Functions class (чтобы не смешиваться с Java 8 Function, который он в основном украл из Guava, а также Predicate и несколько других)

Ответ 3

Начиная с Java 8 вы можете это сделать. Официальный официальный учебник, из которого был получен ваш фрагмент (который был обновлен для Java 8):

Тело интерфейса может содержать абстрактные методы, методы по умолчанию и статические методы. Абстрактному методу в интерфейсе сопровождается точка с запятой, но нет скобок (абстрактный метод не содержит реализации). Методы по умолчанию определяются с помощью модификатора default и статических методов с ключевым словом static. Все абстрактные, стандартные и статические методы в интерфейсе являются неявно общедоступными, поэтому вы можете опустить публичный модификатор.

Или из Java 8 JLS раздел 9.4:

Метод по умолчанию - это метод, объявленный в интерфейсе с модификатором default; его тело всегда представлено блоком. Он обеспечивает реализацию по умолчанию для любого класса, который реализует интерфейс без переопределения метода. Методы по умолчанию отличаются от конкретных методов, объявленных в классах.

...

Интерфейс может объявлять статические методы, которые вызываются без ссылки на конкретный объект.

Ответ 5

в Java 8, интерфейсы могут иметь статические методы, а также переопределяемые методы с реализацией по умолчанию. Тем не менее, у них все еще нет полей экземпляров. Эти функции являются частью поддержки выражения лямбда, и вы можете больше узнать о них в части H. JSR 335