почему статические методы интерфейса Java 8 не могут переопределять методы класса Object [duplicate]

Это может быть слишком поздно, но если вы добавите рабочий стол

 . Columns.AutoFit ();   

или

  рабочий лист.Rows.AutoFit ();   

он также работает.

3
задан KidTempo 3 January 2013 в 14:21
поделиться

4 ответа

Вызов статических методов в Java требует указания точного типа.

Обратите внимание, что этот подход не универсален для всех языков: например, вы можете переопределить методы класса в Objective-C, а какао-каркасы Apple хорошо используют этот механизм для настройки своих «фабричных» классов. Однако методы Java, C ++ и C # не поддерживают полиморфное поведение.

Теоретически разработчики Java могли позволить вам реализовать реализации метода интерфейса с помощью методов static в случае, если реализация не нуждается в доступе состояние из экземпляра. Но такое же поведение легко достичь с помощью тривиальной оболочки:

public class MyImplementation implements MyInterface {
    public MyImplementation(String name) {
    }
    @Override
    public MyInterface getInstance() { // static is not allowed here
        return getInstanceImpl();
    }
    public static getInstanceImpl() {
        return new MyImplementation(name)
    }
}

Компилятор Java мог бы сделать то же самое от вашего имени, но, увидев, что статический метод реализует метод экземпляра, является необычным и запутанным, поэтому я предполагаю, что разработчики Java решили отказаться от предоставления этого «волшебства».

9
ответ дан dasblinkenlight 16 August 2018 в 05:31
поделиться
  • 1
    +1, отметив, что это не универсально. Это синтаксис вызова Java делает этот подход невозможным, а не теоретической границей. – biziclop 2 July 2012 в 17:00

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

Другими словами,

public void mymethod

и

public static void mymethod

НЕ являются тем же самым объявлением метода. Они совершенно разные. Если mymethod определен на интерфейсе, то второе определение просто не удовлетворяет реализации интерфейса.

0
ответ дан hvgotcodes 16 August 2018 в 05:31
поделиться

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

0
ответ дан Iain 16 August 2018 в 05:31
поделиться

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

public void foo(MyInterface i) {
    i.getInstance("abc");
}

теперь я хочу вызвать этот метод с реализацией MyInterface (класс A), но поскольку я не могу передать класс, мне нужно передать объект:

A a = new A();
foo(a);

теперь внутри foo переопределение static getInstance вызывается в экземпляре класса A. Итак, теперь я застрял в создании объекта, чтобы вызвать статический метод.

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

1
ответ дан Tudor 16 August 2018 в 05:31
поделиться
  • 1
    «Это не имеет большого смысла». : это было бы - и это тоже было бы полезно. Вопрос в том, почему он не реализован: stackoverflow.com/questions/20291984/… . Смотрите, как можно было бы назвать эти переопределения – Mr_and_Mrs_D 30 November 2013 в 01:47
Другие вопросы по тегам:

Похожие вопросы: