私は、子が非静的メソッドの可視性を低下させることができないことを知っており、その理由を理解しています。
ただし、「静的メソッドは再宣言によって非表示にすることができる」と読みました。ただし、Javaでこれをどのように実現できるかわかりません。
これは本当に可能ですか?はいの場合、それを行う方法 (コード例) と、なぜそれが導入されたのか (インターフェイスの可視性を低下させないという原則に反しているようです)?
私は、子が非静的メソッドの可視性を低下させることができないことを知っており、その理由を理解しています。
ただし、「静的メソッドは再宣言によって非表示にすることができる」と読みました。ただし、Javaでこれをどのように実現できるかわかりません。
これは本当に可能ですか?はいの場合、それを行う方法 (コード例) と、なぜそれが導入されたのか (インターフェイスの可視性を低下させないという原則に反しているようです)?
ハグベアの貴重なコメントに基づくと、ステートメントの作成者は、同じ宣言を持つメソッドでメソッドをオーバーロードすることで、メソッドを隠すことを意図していたようです。
このリンクを引用:
サブクラスで同じシグネチャを持つ静的メソッドを宣言できますが、実行時のポリモーフィズムがないため、オーバーライドとは見なされません。(...) 派生クラスが基本クラスの静的メソッドと同じシグネチャを持つ静的メソッドを定義する場合、派生クラスのメソッドは基本クラスのメソッドを隠します。
したがって、まったく同じ宣言を持つ子クラスでメソッドを定義すると、子の元のメソッドが効果的に隠されます。ただし、フィールドの場合と同様に、親にキャストすると元のアクセスが復元されます。
サンプルコード:
public class Test {
public static void main( String[] args ) {
B b = new B();
A a = b;
b.f(); // "Access somewhat denied"
a.f(); // "f()"
}
}
class A {
public static void f() {
System.out.println("f()");
}
}
class B extends A {
// *must* be public
public static void f() {
System.out.println("Access somewhat denied");
}
}
そこで、簡単なテストを作成しました。IntelliJは確かにそれを拒否しました...そして、はい、「それはツールです...しかし、私が信頼するものです」と知っています。いずれにせよ、私は javac に行きましたが、同じエラーが発生しました:
Error:(...) java: ...Concrete.java:5: doSomethingStatic() in
...Concrete cannot override doSomethingStatic() in
...Base; attempting to assign weaker access privileges; was public
これと、一般的な懐疑論に基づいて、エラーはドキュメントにあることをお勧めします。
以下は私のサンプルコードで、かなり決定的だと思います。でバーフしprotected
ます。
public class Base
{
public static void doSomethingStatic(){}
}
public class Concrete extends Base
{
protected static void doSomethingStatic(){}
}
派生クラスでオーバーロードされた再宣言によって非表示にすることができます。
class Base
{
public static void doSomethingStatic(){}
}
class Derived extends Base
{
public static void doSomethingStatic(String arg){}
}
ただし、派生クラスを介してアクセスしようとする人にのみ隠されます。