Почему я не могу определить статический метод в интерфейсе Java? - PullRequest
465 голосов
/ 04 февраля 2009

РЕДАКТИРОВАТЬ: Начиная с Java 8, статические методы теперь разрешены в интерфейсах.

Вот пример:

public interface IXMLizable<T>
{
  static T newInstanceFromXML(Element e);
  Element toXMLElement();
}

Конечно, это не сработает. Но почему бы и нет?

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

IXMLizable.newInstanceFromXML(e);

В этом случае я думаю, что он должен просто вызвать пустой метод (т. Е. {}). Все подклассы будут вынуждены реализовать статический метод, поэтому все они будут в порядке при вызове статического метода. Так почему же это невозможно?

РЕДАКТИРОВАТЬ: Я думаю, что я ищу ответ, который глубже, чем "потому что это так, как Java".

Есть ли конкретная технологическая причина, по которой статические методы нельзя перезаписать? То есть, почему разработчики Java решили сделать методы экземпляров переопределенными, а не статическими?

РЕДАКТИРОВАТЬ: Проблема с моим дизайном в том, что я пытаюсь использовать интерфейсы для обеспечения соблюдения правил кодирования.

То есть цель интерфейса двоякая:

  1. Я хочу, чтобы интерфейс IXMLizable позволял мне преобразовывать классы, которые его реализуют, в элементы XML (с использованием полиморфизма, работает нормально).

  2. Если кто-то захочет создать новый экземпляр класса, который реализует интерфейс IXMLizable, он всегда будет знать, что будет статический конструктор newInstanceFromXML (Element e).

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

Ответы [ 24 ]

0 голосов
/ 04 февраля 2009

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

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

Надеюсь, это поможет!

0 голосов
/ 04 апреля 2013

Для чего нужен статический метод в интерфейсе, статические методы используются в основном, когда вам не нужно создавать экземпляр объекта, и вся идея интерфейса состоит в том, чтобы ввести концепции ООП с введением статического метода, от которого вы отклоняетесь. концепция.

0 голосов
/ 29 октября 2017

Чтобы решить это: ошибка: отсутствует тело метода или объявлено абстрактное static void main (String [] args);

interface I
{
    int x=20;
    void getValue();
    static void main(String[] args){};//Put curly braces 
}
class InterDemo implements I
{
    public void getValue()
    {
    System.out.println(x);
    }
    public static void main(String[] args)
    {
    InterDemo i=new InterDemo();
    i.getValue();   
    }

}

выход: 20

Теперь мы можем использовать статический метод в интерфейсе

0 голосов
/ 04 февраля 2009

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

Однако, если вы хотите, вы можете сделать это:

public class A {
  public static void methodX() {
  }
}

public class B extends A {
  public static void methodX() {
  }
}

В этом случае у вас есть два класса с двумя различными статическими методами, которые называются methodX ().

...