Java : @FunctionalInterface (アノテーション) - API使用例
FunctionalInterface (Java SE 20 & JDK 20) の使用例まとめです。
@FunctionalInterface を使うと、関数型インタフェースであることを明示することができます。
API仕様のおともにどうぞ。
概要
@FunctionalInterface は、関数型インタフェースであることを明示するためのアノテーションです。
関数型インタフェースは ラムダ式 として利用できます。
関連:
@FunctionalInterface
public interface Foo {
void func();
}
public class Main {
public static void main(String[] args) {
// ラムダ式
final Foo foo = () -> System.out.println("Foo!");
foo.func();
}
}
// --- PowerShell ---
//PS R:\java-work> ls -Name
//Foo.java
//Main.java
//
//PS R:\java-work> javac *.java
//
//PS R:\java-work> java Main
//Foo!
もし、@FunctionalInterface を使って、関数型インタフェースの 要件を満たさない インタフェースを作ろうとすると コンパイルエラー になります。
これは @FunctionalInterface を使う大きなメリットです。
なぜなら、プログラムを実行する前 … コンパイルの時点でコードの間違いに気づけるからです。
問題は早期発見、早期解決が鉄則です。
試しに、先ほどの Foo インタフェースに抽象メソッドを2つ定義してコンパイルしてみましょう。
(関数型インタフェースには、抽象メソッドは1つだけ、という要件があります)
@FunctionalInterface
public interface Foo {
void func1();
void func2();
}
// --- PowerShell ---
//PS R:\java-work> javac *.java
//Foo.java:2: エラー: 予期しない@FunctionalInterface注釈
//@FunctionalInterface
//^
// Fooは機能インタフェースではありません
// インタフェース Fooで複数のオーバーライドしない抽象メソッドが見つかりました
//エラー1個
想定どおり、コンパイルエラーになりました。
特に明確な理由がない限り、関数型インタフェースを作るときは @FunctionalInterface で明示することをおすすめします。
さらに詳細が知りたいかたは、下記の Java 言語仕様もご参照ください。(英語になります)