35

Javaチュートリアル「インターフェイスの定義」では、次のように述べています。

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

しかし、これは

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

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

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

インターフェイスを使用する必要はないと思います。インターフェイスが適切に整理されているので気に入っています。

4

3 に答える 3

66

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

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

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

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}
于 2011-01-26T05:37:16.487 に答える
6

ここで説明している弱いアクセス権限は、のとメソッドに対するものだと思います(これについては間違っている可能性があります)。すべてのインターフェースメソッドは暗黙的にですが、パッケージプライベートのままにしておきます。これは、よりも弱い保証です。読むために変更foo()bar()NewClasspublicNewClasspublicNewClass

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

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

于 2011-01-26T05:32:51.800 に答える
0

単一継承の問題を回避するために私がうまくいったこと:

Aの代わりにBはCを実装します

私は抽象D(Cのパッケージ保護インターフェース)を拡張Bを持っています

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

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

于 2018-05-25T22:25:30.467 に答える