Почему можно получить доступ к методам класса, используя сигнатуру интерфейса из метода по умолчанию? - PullRequest
0 голосов
/ 22 февраля 2019

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

public interface test {

   String voo();

   default void foo() {
       voo().toString();
   }
}

Ответы [ 2 ]

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

Методами по умолчанию являются методы экземпляра. ( JLS 9.4: объявления методов )

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

Это позволяет нам писать код, который может работать с несколькими типами объектов через общий интерфейс - один вид полиморфизма.

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

При желании это можно сделать с помощью ключевого слова this, определенного как ссылка на объект, для которого был вызван метод экземпляра, типа, в котором появляется ключевое слово.Ключевое слово this может использоваться в методах по умолчанию.( JLS 15.8.3: это )

Итак, в вашем случае ваш метод по умолчанию может вызвать либо this.voo(), либо просто voo().

public interface test {
   String voo();

   default void foo() {
      this.voo().toString(); // Can call an instance method accessible through this type.
      voo().toString();      // Equivalent call
   }
}
0 голосов
/ 22 февраля 2019

Согласно JLS 9.4.3.Тело метода интерфейса Запрещается вызывать другой метод внутри тела метода интерфейса по умолчанию:

Метод по умолчанию имеет тело блока.Этот блок кода обеспечивает реализацию метода в том случае, если класс реализует интерфейс, но не обеспечивает собственную реализацию метода.

На практике методы по умолчанию не сильно отличаются от методов класса, особенно с Java 9, когда можно использовать методы закрытого интерфейса:

public interface Test {

  String voo();

  default void foo() {
   bar();
  }

  private void bar() {
    voo().toString();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...