Javaサブクラスのメソッドの可視性を下げることができないのはなぜですか?
-
05-07-2019 - |
質問
サブクラスでメソッドをオーバーライドしているときにメソッドの可視性を低下させると、コンパイラがエラーメッセージを表示するのはなぜですか?
解決
サブクラスのすべてのインスタンスは基本クラスの有効なインスタンスである必要があるため( Liskov置換の原則を参照してください)。
サブクラスが突然基底クラスの1つのプロパティ(たとえば、パブリックメソッド)を失った場合、基底クラスの有効な代替ではなくなります。
他のヒント
これが許可されている場合、次の状況が発生する可能性があるため:
Class Subは、Parentクラスを継承します。親にはパブリックメソッド foo
があり、Subはそのメソッドをプライベートにします。次のコードは、 bar
の宣言されたタイプがParentであるため、正常にコンパイルされます。
Parent bar = new Sub();
bar.foo();
ただし、これがどのように動作するかは明確ではありません。 1つの可能性は、実行時エラーを発生させることです。別の方法は、単純に許可することです。これにより、親クラスにキャストするだけで、外部からプライベートメソッドを呼び出すことができます。これらの選択肢はいずれも受け入れられないため、許可されません。
サブタイプはスーパータイプのインスタンスとして使用可能でなければならないため。
所属していません StackOverflow