3

静的フィールドFを持つクラスAがあります。

class A {
    public static String F = null;
}

クラスB:

class B extends A {
   public static String F = "somestring";
} 

フィールドFを使用するメソッドを持つ型付きクラス:

class C<T extends A> {
   public void someMethod() {
      String someString = T.F;
      // Manipulations with someString
   }
}

そしてそれを呼び出す私のコード。

C<B> c = new C<B>();
c.someMethod();

someStringで操作しようとすると、nullポインタ例外が発生します。したがって、TFはnullですが、TはBなので、「somestring」である必要があります。なんで?

4

4 に答える 4

7

フィールドをオーバーライドすることはできません。拡張 A であるため、常に A のフィールドを使用します。

F を返すクラス A と B にゲッターを追加します。そこから、A のメソッドを B のメソッドでオーバーライドします。

class A {
    public String getF(){
        return null;
    }
}

class B {
    @Override
    public String getF(){
        return "someString";
    }
}
于 2013-02-07T20:14:41.583 に答える
2

これはジェネリックとは関係ありません。

クラスのフィールドをサブクラスでオーバーライドすることはできません。オーバーライドできるのはメソッドだけです。したがって、スーパークラスのフィールドと同じ名前でサブクラスのフィールドを定義したとしても、たまたま同じ名前を持つ新しいフィールドを作成しているだけですが、実際には前のフィールドをシャドウします (オーバーライドしません)。

サブクラスのコンストラクターにフィールドのデフォルト値を代入することを検討してください。その後、動作するはずです。

于 2013-02-07T20:15:38.173 に答える
2

Java の静的メンバーは非表示にすることはできますが、オーバーライドすることはできません。静的メンバーへの参照はコンパイル時に解決されます。また、コンパイル時に T の唯一の既知の型は A です。

http://www.coderanch.com/how-to/java/OverridingVsHidingを参照してください。

編集:フィールドが静的であるかインスタンスであるかに関係なく、とにかくフィールドをオーバーライドすることはできません。

于 2013-02-07T20:24:48.967 に答える