Лямбда-выражения (ошибка - Target type of a lambda conversion must be an interface)

Рейтинг: 0Ответов: 1Опубликовано: 17.05.2023
@FunctionalInterface
public interface Car {
    void star();
}
public class Lada implements Car {

    @Override
    public void star() {
        System.out.println("Yes!!");
    }
}
public class Main{
    public static void main(String[] args) {
        Lada lada1 = new Lada();
        lada1.star();

        Lada lada2 = new Lada() {
            @Override
            public void star() {
                System.out.println("yes!");
            }
        };
        lada2.star();

        Lada lada3 = () -> System.out.println("No");/// ошибка 
        lada.star();

        Car car3 = () -> System.out.println("No");
        car3.star();
    }
}

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

Lada lada3 = () -> System.out.println("No");///  ошибка
lada3.star();

Ответы

▲ 1

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

Любой же класс по определению имеет как минимум одного предка Object, у которого есть свои методы (как минимум hashCode, equals, toString, clone), а значит, нарушается требование к количеству методов.

В самом деле, при присваивании лямбды к ссылке-классу Lada, нельзя определить, к какому из методов этого класса относится лямбда-выражение.