Как работает функциональный интерфейс в Java 8 - PullRequest
3 голосов
/ 01 мая 2019

Вот пример, с которым я столкнулся при изучении концепции функционального интерфейса.

interface Sayable{  
   void say();  
}  
public class MethodReference {  
    public static void saySomething(){  
        System.out.println("Hello, this is static method.");  
    }  
    public static void main(String[] args) {  
        // Referring static method  
        Sayable sayable = MethodReference::saySomething;  
        // Calling interface method  
        sayable.say();  
    }  
} 

Это печать "Здравствуйте, это статический метод." на выходе, когда он работает. Мой вопрос, как это печатать вывод, когда мы вызываем метод say () (который не реализован)

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Ссылку на метод можно представить так:

Sayable sayable = new Sayable() {

    @Override
    void say() {
        // Grab the body of the method referenced by the method reference,
        // which is the following:
        System.out.println("Hello, this is static method.");
    }
}

Ссылка на метод действительна, потому что

  • тип назначения - функциональный интерфейс Sayable (вы пытаетесь сохранить результат в типе Sayable);и
  • подпись ссылки метода на saySomething() соответствует методу функционального интерфейса say(), то есть параметры и возвращаемый тип match 1 .

Реализация метода say() экземпляра Sayable, называемого переменной sayable, равна телу метода, к которому относится ссылка на метод относится к.

Так, как в комментариях говорит Дж. Б. Низет, say() на самом деле реализовано .


1 Небольшая деталь: слово «совпадение» не совсем означает «равны».Например, если saySomething() вернул int, он все равно работал бы, хотя единственный метод целевого типа определяет тип возвращаемого значения void.

0 голосов
/ 01 мая 2019

По существу, интерфейс только с одним абстрактным методом - это Функциональный интерфейс.

Если вы хотите создать интерфейсный объект анонимно и вызвать saySomething () для MethodReference. Нормальным образом это будет так ..

Sayable sayable = new Sayable() {
  @Override
    void say() {
       MethodReference::saySomething;  
    }
}

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

Так что вы можете сказать.

Sayable sayable = MethodReference::saySomething;  

Это только для функциональных интерфейсов. Не для интерфейсов с несколькими абстрактными методами.

...