これは Java 8 でのみ可能です。Java 7言語仕様 §9.4では、明示的に次のように述べています。
静的メソッドは抽象化できないため、インターフェイスで宣言されたメソッドが静的であると宣言されると、コンパイル時エラーになります。
そのため、Java 7 では、インターフェースの静的メソッドは存在できません。
Java 8 Language Specification §9.4.3に行くと、次のように書かれていることがわかります。
静的メソッドには、メソッドの実装を提供するブロック本体もあります。
そのため、Java 8 ではそれらが存在できると明示的に述べています。
Java 1.7.0_45 で正確なコードを実行しようとしましたが、「modifier static not allowed here」というエラーが表示されました。
以下は、Java 8チュートリアルのDefault Methods (Learning the Java Language > Interfaces and Inheritance)からの直接の引用です。
静的メソッド
デフォルトのメソッドに加えて、インターフェイスで静的メソッドを定義できます。(静的メソッドは、任意のオブジェクトではなく、それが定義されているクラスに関連付けられているメソッドです。クラスのすべてのインスタンスは、その静的メソッドを共有します。)これにより、ライブラリ内のヘルパー メソッドを整理しやすくなります。別のクラスではなく、同じインターフェイス内のインターフェイスに固有の静的メソッドを保持できます。ZoneId
次の例では、タイム ゾーン識別子に対応するオブジェクトを取得する静的メソッドを定義します。ZoneId
指定された識別子に対応するオブジェクトがない場合は、システムの既定のタイム ゾーンが使用
されます。(結果として、メソッドを簡素化できますgetZonedDateTime
):
public interface TimeClient {
// ...
static public ZoneId getZoneId (String zoneString) {
try {
return ZoneId.of(zoneString);
} catch (DateTimeException e) {
System.err.println("Invalid time zone: " + zoneString +
"; using default time zone instead.");
return ZoneId.systemDefault();
}
}
default public ZonedDateTime getZonedDateTime(String zoneString) {
return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
}
}
クラスの静的メソッドと同様に、インターフェイスのメソッド定義がstatic
メソッド シグネチャの先頭にあるキーワードを使用して静的メソッドであることを指定します。静的メソッドを含むインターフェイス内のすべてのメソッド宣言は暗黙的に であるため、修飾子public
を省略できます。public