Полагаю, вы откуда-то слышали, что "вы можете реализовать одно-интерфейсные интерфейсы с лямбда-выражением!" и приступил к его испытанию, написав этот код, все время неправильно понимая, что подразумевается под этим.
Лямбда-выражения не на самом деле позволяют писать 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
на правая часть =
, не так ли? Но теперь вы можете просто использовать лямбда-выражение! Это потому, что сигнатура лямбда-выражения совпадает с сигнатурой одиночного метода в интерфейсе, поэтому компилятор говорит: «Да, все в порядке, я просто буду использовать это как реализацию этого метода».