広告

Java : @FunctionalInterface (アノテーション) - API使用例

FunctionalInterface (Java SE 20 & JDK 20) の使用例まとめです。
@FunctionalInterface を使うと、関数型インタフェースであることを明示することができます。

API仕様のおともにどうぞ。


概要

インタフェース型の宣言を、Java言語仕様に定義されている関数型インタフェースとすることを目的としていることを示すために使われる情報目的の注釈型です。 概念上、1つの関数型インタフェースには抽象メソッドが1つだけあります。

クラス構成

@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 言語仕様もご参照ください。(英語になります)


関連記事

ページの先頭へ