Javaのinterfaceは、何故protected修飾が出来ないのか

投稿者: Anonymous

何故Javaのinterfaceに宣言されているメソッドにprotected修飾が出来ないようにされたのでしょうか。


AndroidのonClickメソッドはpublicでしかオーバーライド出来ません。理由はinterfacepublicじゃないと宣言できないからです。このようにした理由はなぜでしょうか?

privateだとアクセスできないのはわかります。
なら、package privateprotectedはなぜ出来ないのでしょうか。継承先ではアクセスできるはずです。

解決

インターフェースは外側から使えるメソッドを定義しておくのが目的なのでpublicなメソッドがあれば十分です。
とは言え、Java 8でデフォルトメソッドが扱えるようになったので、そのデフォルトメソッドから利用するヘルパメソッド等を隠蔽する意義はあるかも知れません。
実際手元のJDK9(build 122)のjavacでは以下のコードがコンパイルを通りました。

interface Test {
   default void meth() {
    help();
   }
   private void help() {
    System.out.println("Hello!");
   }
}

protectedについては多重継承による衝突の解決の問題もあるのではないでしょうか。

以下、参考までにJVMの仕様変更について
Java SE 7版のChapter 4. The class File Formatには次のように書かれています。

All interface methods must have their ACC_ABSTRACT and ACC_PUBLIC
flags set; they may have their ACC_VARARGS, ACC_BRIDGE and
ACC_SYNTHETIC flags set and must not have any of the other flags in
Table 4.5 set (JLS §9.4).

従ってJVMのレベルでインターフェースでprivateprotectedなメソッドは扱えません。

一方Java SE 8版のChapter 4. The class File Formatには次のように書かれています。

Methods of interfaces may have any of the flags in Table 4.6-A set
except ACC_PROTECTED, ACC_FINAL, ACC_SYNCHRONIZED, and ACC_NATIVE (JLS
§9.4). In a class file whose version number is less than 52.0, each
method of an interface must have its ACC_PUBLIC and ACC_ABSTRACT flags
set; in a class file whose version number is 52.0 or above, each
method of an interface must have exactly one of its ACC_PUBLIC and
ACC_PRIVATE flags set.

protectedは相変わらずダメですがprivateは扱えるようになっています。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *