Почему интерфейсы Java не могут содержать реализации статических методов? - PullRequest
2 голосов
/ 15 ноября 2010

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

Ответы [ 6 ]

6 голосов
/ 15 ноября 2010

Поскольку интерфейс описывает что .Это не описывает как .

3 голосов
/ 15 ноября 2010

Если вы действительно хотите добавить (скрыть) некоторую логику внутри интерфейса, вы можете рассмотреть возможность добавления внутреннего класса (Примечание: никогда не делайте этого, это просто показывает, что возможно с чисто технической точки зрения):

public interface Person {
  public String getFirstName();
  public String getLastName();
  public class Util {
    public String getName(Person person) {
      return person.getFirstName() + " " + person.getLastName();
    }
  }
}

Если вы используете это, это немного похоже на статический код метода в интерфейсе:

String fullName = Person.Util.getName(this);

Как я уже сказал - это чисто технически, и я неЯ не вижу причин, чтобы это сделать.Статический метод может находиться в любом классе, нет необходимости добавлять его в интерфейс.

1 голос
/ 15 ноября 2010

Я согласен, что статический метод не имеет смысла в интерфейсе. Но я не понимаю, почему Java позволяет статические члены в интерфейсе. Кажется немного противоречивым.

1 голос
/ 15 ноября 2010

Интерфейс - это контракт.Он говорит, что будет у реализующего объекта (как минимум), но это все.Там написано: «В этом доме будет дверь, окно и дымоход».

Абстрактный класс больше похож на сборный дом.Он не завершен (вы должны добавить свой собственный сайдинг, например), но в нем уже есть детали (есть место для двери, но весь камин уже настроен.

Проблема с вводом кода винтерфейсы - это множественное наследование. Java не позволяет этого. У вас может быть класс, реализующий много интерфейсов, потому что интерфейсы только обещают, что будет метод с заданной сигнатурой.

Если интерфейсы содержат код, то вы можете реализовать3 из них, каждый с телом метода для myUsefulFunction (String thing) ... и теперь вы не знаете, какой из них вызывается.

Вот почему абстрактные классы могут иметь методы bodys (потому что вы можете расширять толькоодин класс), но интерфейсы не могут (потому что вы можете реализовать несколько интерфейсов).

0 голосов
/ 15 ноября 2010

Интерфейс - это специальный абстрактный класс со всеми абстрактными методами.

Вы можете свободно создавать собственный абстрактный класс, который содержит (неабстрактные) статические методы, но тогда вы можете наследовать только отодин из них.

Еще лучше, создайте отдельный вспомогательный класс с вашими статическими методами.

0 голосов
/ 15 ноября 2010

Это абстрактный класс или обычный класс, который должен что-то реализовывать. Интерфейсы не должны иметь каких-либо реализаций, но они содержат интерфейс связи. Поэтому статические методы недопустимы.

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