web-dev-qa-db-ja.com

Javaチュートリアルでは、パッケージプライベートインターフェースを使用できると記載されていますが、使用できません

Javaチュートリアル「インターフェイスの定義」 では、

インターフェイスがpublicであると指定しない場合、インターフェイスは、インターフェイスと同じパッケージで定義されたクラスにのみアクセスできます。

しかし、これは

interface PPInterface {
    void foo();
    void bar();
}

class NewClass implements PPInterface {
    void foo() {}
    void bar() {}
}

弱いアクセス権限を割り当てようとしているため、NewClassでコンパイラエラーが発生します。公開された」。だから、ドキュメントが間違っている、または何か間違ったことをした、またはドキュメントを誤って解釈したのですか?

インターフェースを使用する必要がないと思います-うまく整理できるので気に入っています。

32
Pete

パッケージプライベートにすることができるのはインターフェイス自体であり、メソッドではありません。定義したパッケージ内でのみ(名前で)使用できるインターフェースを定義できますが、そのメソッドはすべてのインターフェースメソッドと同様にpublicです。クラスがそのインターフェースを実装する場合、クラスが定義するメソッドはpublicでなければなりません。ここで重要なのは、それがメソッドではなく、パッケージの外部に表示されないのがインターフェイスtypeであることです。インターフェースで定義されたメソッドを使用することは、インターフェース自体を使用することと同じではないため、ドキュメントは正しくありません。

また、インターフェースを定義する場合、メソッドはすべて暗黙的にpublicであるため、メソッド定義の前にpublicを追加しなくても何も変更されないことに注意してください。

インターフェースを実装しているクラス自体がパッケージプライベートである場合、インターフェースメソッドのpublicnessは明らかに問題ではありません。もちろん、単一継承の問題が邪魔にならない場合は、インターフェースの代わりに抽象クラスを使用することもできます。

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}
57
ColinD

I think(これについては間違っているかもしれませんが)ここで説明されている弱いアクセス権限はNewClassfoo()およびbar()メソッドに対するものである。すべてのインターフェイスメソッドは暗黙的にpublicですが、NewClassではそれらをpackage-privateのままにしました。これはpublicよりも弱い保証です。 NewClassを読み取りに変更

class NewClass implements PPInterface{
    public void foo() {}
    public void bar() {}
}

おそらくはこれを修正します。

4
templatetypedef

単一継承の問題を回避するために私が働いたもの:

Aの代わりにBがCを実装する

抽象D(Cでパッケージ保護されたインターフェイス)がBを拡張しています

そしてAはDを拡張します

正常に動作します。きれいにも、tbh。

0
Blaze