質問: 何故Javaの`interface`に宣言されているメソッドに`protected`修飾が出来ないようにされたのでしょうか。 --- Androidの`onClick`メソッドは`public`でしかオーバーライド出来ません。理由は`interface`は`public`じゃないと宣言できないからです。このようにした理由はなぜでしょうか? `private`だとアクセスできないのはわかります。 なら、`package private`や`protected`はなぜ出来ないのでしょうか。継承先ではアクセスできるはずです。
回答: `private`は`protected`と違い、継承したクラスからですら(リフレクションなど一部例外を除いて)アクセスできないので、継承して初めて参照できる`interface`のメンバーに`private`を持たせることがその目的と反していうるためじゃ無いでしょうか。 onClickなどは別クラスからアクセスされるので`public`でなければなりません。オーバーライドされたく無いばあいは`final`をつけて`public final void onClick(View v){...}`とすればサブクラスからオーバーライドできなくなります。 **追記に関して** `interface`に`protected`が使えない究極的な理由は、Javaを作った人がそうすることに決めたからということになるような気がします。ただそうした理由としては、interfaceという英単語が持つ意味的に、内部でやっていることを隠して外部に公開する機能のみを表記するためだけに使って欲しかったからでは無いでしょうか。 `interface`にある`protected`なメンバーは`interface`を継承したクラスをさらに継承しないと使えませんから、外部に提供する機能とはちょっと違ったニュアンスになるような気がします。そういう用途には`abstract class`の方を使って欲しかったのかもしれません。