Почему я не могу объявить статические методы в интерфейсе? - PullRequest
148 голосов
/ 22 августа 2008

В теме говорится больше всего - в чем причина того, что статические методы не могут быть объявлены в интерфейсе?

public interface ITest {
    public static String test();
}

Приведенный выше код дает мне следующую ошибку (по крайней мере в Eclipse): «Недопустимый модификатор для метода интерфейса ITest.test (); разрешены только публичные и абстрактные».

Ответы [ 14 ]

0 голосов
/ 21 февраля 2019

С Java 8 интерфейсы теперь могут иметь статические методы.

Например, в Comparator есть статический метод naturalOrder ().

Требование, чтобы интерфейсы не могли иметь реализации, также было смягчено. Интерфейсы теперь могут объявлять реализации метода «по умолчанию», которые похожи на обычные реализации с одним исключением: если вы наследуете как реализацию по умолчанию от интерфейса, так и обычную реализацию от суперкласса, реализация суперкласса всегда будет иметь приоритет.

0 голосов
/ 15 декабря 2013

Так как статические методы не могут быть унаследованы. Так что нет смысла помещать его в интерфейс. Интерфейс - это контракт, которому должны следовать все его подписчики. Размещение статического метода в интерфейсе заставит подписчиков реализовать его. что теперь противоречит тому факту, что статические методы не могут быть унаследованы.

0 голосов
/ 02 октября 2013

Недопустимая комбинация модификаторов: статические и абстрактные

Если член класса объявлен как статический, его можно использовать с именем класса, которое привязано к этому классу, без создания объекта.

Если член класса объявлен как абстрактный, вам нужно объявить класс абстрактным и предоставить реализацию абстрактного члена в его унаследованном классе (подклассе).

Вам необходимо предоставить реализацию абстрактному члену класса в подклассе, где вы собираетесь изменить поведение статического метода, также объявленного как абстрактный, который ограничен базовым классом, что неверно 1007 *

0 голосов
/ 22 августа 2008

Возможно, пример кода поможет, я собираюсь использовать C #, но вы должны быть в состоянии следовать.

Давайте представим, что у нас есть интерфейс под названием IPayable

public interface IPayable
{
    public Pay(double amount);
}

Теперь у нас есть два конкретных класса, которые реализуют этот интерфейс:

public class BusinessAccount : IPayable
{
    public void Pay(double amount)
    {
        //Logic
    }
}

public class CustomerAccount : IPayable
{
    public void Pay(double amount)
    {
        //Logic
    }
}

Теперь давайте представим, что у нас есть коллекция различных учетных записей, для этого мы будем использовать общий список типа IPayable

List<IPayable> accountsToPay = new List<IPayable>();
accountsToPay.add(new CustomerAccount());
accountsToPay.add(new BusinessAccount());

Теперь мы хотим заплатить $ 50,00 на все эти счета:

foreach (IPayable account in accountsToPay)
{
    account.Pay(50.00);
}

Итак, теперь вы видите, как интерфейсы невероятно полезны.

Они используются только для созданных экземпляров объектов. Не на статических классах.

Если бы вы сделали статическую оплату, то при циклическом просмотре списка IPayable в accountToPay не было бы способа выяснить, следует ли вызывать pay на BusinessAcount или CustomerAccount.

...