インターフェースにおける静的メソッドは、Java 8から導入されました。これらはstaticキーワードを使って宣言され、インターフェース内で直接実装されます。静的メソッドは実装クラスには継承されず、インターフェースの名前を通じて呼び出されます。
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);質問: インターフェースの静的メソッドは、実装クラスのオブジェクトを通じて呼び出すことができますか?
回答: いいえ、インターフェースの静的メソッドは常にインターフェースの名前を通じて呼び出され、インスタンスや実装クラスの名前を通じては呼び出されません。以下のコードはコンパイルエラーを引き起こします:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // エラー! MathUtils.sum(1, 2)が必要
歴史
開発者はインターフェースの静的メソッドを実装クラスで「オーバーライド」しようと誤って試み、インスタンスを通じてこのメソッドを呼び出すことを期待していました。その結果、常にインターフェースのバージョンが呼び出され、使用中に誤ったビジネスロジックが発生しました。
歴史
ユーティリティメソッドをクラスからインターフェースに移動する際に、一部のコードがオブジェクトを介して呼び出すことを使用しました:
obj.method()、これは不可能になり、プロジェクト全体でInterfaceName.method()に呼び出しをリファクタリングする必要がありました。
歴史
旧バージョンのJavaのサポートによって、インターフェースに静的メソッドを追加した後にコンパイルエラーが発生しました。開発者はCIで使用されているコンパイラーのバージョンを確認せず、ビルドが定期的に失敗し始めました。