Eran が述べたように、ラムダ式は関数型インターフェイスでのみ使用できますが、インターフェイス内で複数のメソッドが本当に必要な場合は、必要に応じて修飾子を変更し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();
}