web-dev-qa-db-ja.com

Javaサブクラスのメソッドの可視性を減らすことができないのはなぜですか?

サブクラスでメソッドをオーバーライドしているときにメソッドの可視性を下げると、コンパイラがエラーメッセージを表示するのはなぜですか?

42
ria

サブクラスのすべてのインスタンスは、基本クラスの有効なインスタンスである必要があるためです( リスコフの置換原則 を参照)。

サブクラスが突然基本クラスの1つのプロパティ(つまり、パブリックメソッドなど)を失った場合、それは基本クラスの有効な代替ではなくなります。

65
Joachim Sauer

これが許可された場合、次の状況が発生する可能性があるためです。

クラスSubはクラスParentから継承します。親にはパブリックメソッドfooがあり、サブはそのメソッドをプライベートにします。 barの宣言されたタイプは親であるため、次のコードは正常にコンパイルされます。

Parent bar = new Sub();
bar.foo();

ただし、これがどのように動作するかは明確ではありません。 1つの可能性は、ランタイムエラーを引き起こすことです。もう1つは、単純に許可することです。これにより、親クラスにキャストするだけで、外部からプライベートメソッドを呼び出すことができます。これらの選択肢はどちらも受け入れられないため、許可されていません。

18
sepp2k

サブタイプはスーパータイプのインスタンスとして使用できる必要があるためです。

1
z -