Ответ 1
Лямбда-выражения применимы только к функциональному интерфейсу, как говорит Эран, но если вам действительно нужны несколько методов в интерфейсах, вы можете изменить модификаторы на default
по default
или static
и переопределить их в классах, которые их реализуют, если это необходимо.
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL
I2 i2 = () -> System.out.println(); // TOTALLY LEGAL
I3 i3 = () -> System.out.println(); // TOTALLY LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 {
void show1();
default void show2() {}
}
interface I3 {
void show1();
static void show2 () {}
}
наследование
Вы не должны забывать унаследованные методы.
Здесь I2
наследует show1
и show2
и, следовательно, не может быть функциональным интерфейсом.
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL BUT WE SAW IT EARLIER
I2 i2 = () -> System.out.println(); // NOT LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 extends I1 {
void show3();
}
аннотирование
Чтобы убедиться, что ваш интерфейс является функциональным интерфейсом, вы можете добавить следующую аннотацию @FunctionalInterface
@FunctionalInterface <------- COMPILATION ERROR : Invalid '@FunctionalInterface' annotation; I1 is not a functional interface
interface I1 {
void show1();
void show2();
}
@FunctionalInterface
interface I2 {
void show3();
}