Лямбда-выражения (ошибка - Target type of a lambda conversion must be an interface)
@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 шт):
Автор решения: Nowhere Man
→ Ссылка
Потому что целевым типом лямбда-выражения по определению является только функциональный интерфейс, т.е. интерфейс, имеющий ровно один метод.
Любой же класс по определению имеет как минимум одного предка Object, у которого есть свои методы (как минимум hashCode, equals, toString, clone), а значит, нарушается требование к количеству методов.
В самом деле, при присваивании лямбды к ссылке-классу Lada, нельзя определить, к какому из методов этого класса относится лямбда-выражение.