したがって、次のような問題があります。
package com.blah.A_package;
public class A
{
public void f() {
g();
}
protected void g() {
System.out.println("superclass g()");
}
}
package com.blah.B_package;
public class B extends com.blah.A_package.A
{
protected void g() {
System.out.println("subclass g()");
}
}
public static void main(String[] args)
{
A scratch = new A();
scratch.f();
}
実行すると、予想される「スーパークラス g()」の代わりに「サブクラス g()」が出力されます。
実際には、スーパークラスとサブクラスの両方のオブジェクトを作成し (これは jar のリフレクションによって行われます)、それらをマップに貼り付け、必要に応じて引き出しますが、object.getClass を出力して確認しました。 ().getName() そして、実際にスーパークラスのインスタンス化を行っていることがわかります。
とにかく、アプリケーションを実行すると、何らかの理由で、オブジェクトがスーパークラスのインスタンス化であるにもかかわらず、スーパークラスではなくメソッドのサブクラスのコピーが使用されます (つまり、サブクラスのメソッドについても認識してはいけません)。これは、私自身と同僚が気付いていない既知のことですか? なぜこれが起こったのか、私たちは完全に困惑しています。