インターフェイスが
public
であると指定しない場合、インターフェイスは、インターフェイスと同じパッケージで定義されたクラスにのみアクセスできます。
しかし、これは
interface PPInterface {
void foo();
void bar();
}
class NewClass implements PPInterface {
void foo() {}
void bar() {}
}
弱いアクセス権限を割り当てようとしているため、NewClass
でコンパイラエラーが発生します。公開された」。だから、ドキュメントが間違っている、または何か間違ったことをした、またはドキュメントを誤って解釈したのですか?
インターフェースを使用する必要がないと思います-うまく整理できるので気に入っています。
パッケージプライベートにすることができるのはインターフェイス自体であり、メソッドではありません。定義したパッケージ内でのみ(名前で)使用できるインターフェースを定義できますが、そのメソッドはすべてのインターフェースメソッドと同様にpublic
です。クラスがそのインターフェースを実装する場合、クラスが定義するメソッドはpublic
でなければなりません。ここで重要なのは、それがメソッドではなく、パッケージの外部に表示されないのがインターフェイスtypeであることです。インターフェースで定義されたメソッドを使用することは、インターフェース自体を使用することと同じではないため、ドキュメントは正しくありません。
また、インターフェースを定義する場合、メソッドはすべて暗黙的にpublic
であるため、メソッド定義の前にpublic
を追加しなくても何も変更されないことに注意してください。
インターフェースを実装しているクラス自体がパッケージプライベートである場合、インターフェースメソッドのpublic
nessは明らかに問題ではありません。もちろん、単一継承の問題が邪魔にならない場合は、インターフェースの代わりに抽象クラスを使用することもできます。
abstract class Whatever {
abstract void foo();
abstract void bar();
}
I think(これについては間違っているかもしれませんが)ここで説明されている弱いアクセス権限はNewClass
のfoo()
およびbar()
メソッドに対するものである。すべてのインターフェイスメソッドは暗黙的にpublic
ですが、NewClass
ではそれらをpackage-privateのままにしました。これはpublic
よりも弱い保証です。 NewClass
を読み取りに変更
class NewClass implements PPInterface{
public void foo() {}
public void bar() {}
}
おそらくはこれを修正します。
単一継承の問題を回避するために私が働いたもの:
Aの代わりにBがCを実装する
抽象D(Cでパッケージ保護されたインターフェイス)がBを拡張しています
そしてAはDを拡張します
正常に動作します。きれいにも、tbh。