Функциональный интерфейс, функциональный метод и лямда? - PullRequest
2 голосов
/ 27 апреля 2020

Я реализовал функциональный интерфейс, используя функциональный метод в лямбда-функции. Все работает хорошо, за исключением того, что я получаю сообщение об ошибке, что этот унаследованный абстрактный метод (в моем случае это функциональный метод) должен быть реализован. И тут я запутался. Я использовал лямбда-функцию для реализации этого функционального метода и почему я должен снова реализовать метод. Как правильно реализовать функциональные методы? Мой код:

interface MyFunction {
  int getValue(int num); }

class Factorial implements MyFunction {
  public static void main (String [] args) {
        MyFunction myFactorialFunc = (num) -> {
            int fact = 1;
            for(int i = 1; i <= num; i++){
                fact = i * fact;
            }
            return fact;
        };
        System.out.println(myFactorialFunc.getValue(7));
}
}

Спасибо за вашу помощь. :)

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

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

Лямбда-выражения не на самом деле позволяют писать class MyClass implements SomeInterface без объявления требуемого метод. Что касается компилятора, Factorial имеет только объявленный метод main, а метод getValue отсутствует, поэтому он не реализует интерфейс MyFunction.

Ваш код демонстрирует " Вы можете реализовать интерфейсы с одним методом с помощью лямбда-выражения "хотя. Здесь, в методе main, вы присвоили лямбда-выражение переменной типа MyFunction:

MyFunction myFactorialFunc = (num) -> {
    int fact = 1;
    for(int i = 1; i <= num; i++){
        fact = i * fact;
    }
    return fact;
};

Обычно вы должны поставить реализацию MyFunction на правая часть =, не так ли? Но теперь вы можете просто использовать лямбда-выражение! Это потому, что сигнатура лямбда-выражения совпадает с сигнатурой одиночного метода в интерфейсе, поэтому компилятор говорит: «Да, все в порядке, я просто буду использовать это как реализацию этого метода».

0 голосов
/ 27 апреля 2020

Вы определили свой класс Factorial для реализации MyFunction, но он не реализует метод этого интерфейса (int getValue(int num);).

Экземпляр MyFunction, реализованный в вашем main использование лямбда-выражения не реализует этот интерфейс для вашего Factorial класса.

Просто измените его на:

class Factorial {
    public static void main (String [] args) {
        MyFunction myFactorialFunc = (num) -> {
            int fact = 1;
            for(int i = 1; i <= num; i++){
                fact = i * fact;
            }
            return fact;
        };
        System.out.println(myFactorialFunc.getValue(7));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...