В Java 8 абстрактный класс только с одним абстрактным методом не является функциональным интерфейсом (JSR 335 ).
Этот interface
представляет собой функциональный интерфейс:
public interface MyFunctionalInterface {
public abstract void myAbstractMethod();
public default void method() {
myAbstractMethod();
}
}
но это abstract class
не:
public abstract class MyFunctionalAbstractClass {
public abstract void myAbstractMethod();
public void method() {
myAbstractMethod();
}
}
Поэтому я не могу использовать абстрактный класс в качестве цели для лямбда-выражений и ссылок на методы.
public class Lambdas {
public static void main(String[] args) {
MyFunctionalAbstractClass functionalAbstractClass = () -> {};
}
}
Ошибка компиляции: The target type of this expression must be a functional interface
.
Почему разработчики языка наложили это ограничение?