1. ホーム
  2. java

[解決済み] インターフェイスメソッドはボディを持つことができますか?

2023-07-10 05:43:51

質問

インターフェースは100%純粋な抽象クラスのようなものだということは知っています。したがって、その中にメソッドの実装を持つことはできません。しかし、私は奇妙なコードを見ました。誰か説明できますか?

コードスニペットです。

 interface Whoa {
        public static void doStuff() {
            System.out.println("This is not default implementation");
        }
 }

EDITです。

私のIDEはIntellij Idea 13.1です。プロジェクトSDKは、java 7 <1.7.0_25> です。IDEでは、コンパイラーエラーは表示されません。しかし、コマンドラインでコードをコンパイルすると、次のメッセージが表示されます。

Whoa.java:2: error: modifier static not allowed here
    public static void doStuff() {
                       ^

どのように解決するのですか?

から Java 8 では、デフォルトのメソッドに加え、インターフェイスに静的メソッドを定義することができます。

  • 静的メソッドは、任意のオブジェクトではなく、それが定義されているクラスに関連付けられているメソッドです。クラスのすべてのインスタンスはその静的メソッドを共有します。

  • これにより、ライブラリ内のヘルパーメソッドを整理しやすくなります。あるインターフェースに固有の静的メソッドを、別のクラスではなく同じインターフェース内に保持することができるのです。

  • を取得する静的メソッドを定義しています。 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));
   }    
}

こちらもご覧ください