Это возможно только в Java 8. В Спецификация языка Java 7 §9.4 он явно указывает:
Это ошибка времени компиляции, если метод, объявленный в интерфейсе, объявлен static, потому что статические методы не могут быть абстрактными.
blockquote>Таким образом, в Java 7 статические методы в интерфейсах не могут существовать .
Если вы перейдете к Спецификации языка Java 8 §9.4.3 , вы увидите, что он говорит:
Статический метод также имеет тело блока, который обеспечивает реализацию метода.
blockquote>Таким образом, он явно заявляет, что в Java 8 они могут существовать .
Я даже пытался запустите ваш точный код в Java 1.7.0_45, но он дал мне ошибку «модификатор static не разрешен здесь».
Вот цитата прямо из Java 8 Методы по умолчанию (Изучение языка Java> Интерфейсы и наследование) :
Статические методы
В additi по умолчанию, вы можете определить статические методы в интерфейсах. (Статический метод - это метод, который связан с классом, в котором он определен, а не с каким-либо объектом. Каждый экземпляр класса использует свои статические методы.) Это упрощает организацию вспомогательных методов в ваших библиотеках; вы можете сохранять статические методы, специфичные для интерфейса в одном и том же интерфейсе, а не в отдельном классе. В следующем примере определяется статический метод, который извлекает объект
ZoneId
, соответствующий идентификатору часового пояса; он использует часовой пояс системы по умолчанию, если нет объектаZoneId
, соответствующего данному идентификатору. (В результате вы можете упростить методgetZonedDateTime
):public interface TimeClient { // ... static public 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 public ZonedDateTime getZonedDateTime(String zoneString) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); } }
Как и статические методы в классах, вы указываете, что определение метода в интерфейсе является статическим методом с ключевым словом
blockquote>static
в начале подписи метода. Все декларации методов в интерфейсе, включая статические методы, неявноpublic
, поэтому вы можете опустить модификаторpublic
.