0

Java で、継承されたクラスの変数のクラス型をオーバーライドするにはどうすればよいですか? 例えば:

class Parent {
  protected Object results;

  public Object getResults() { ... } 
}

class Child extends parent {

  public void operation() { 
  ... need to work on results as a HashMap
  ... results.put(resultKey, resultValue);
  ... I know it is possible to cast to HashMap everytime, but is there a better way?
  }

  public HashMap getResults() {
  return results;
}
4

1 に答える 1

8

これを実現するためにジェネリックを使用できます。

class Parent<T> {
    protected T results;

    public T getResults() {
        return results;
    } 
}

class Child extends Parent<HashMap<String, Integer>> {

    public void operation() { 
        HashMap<String, Integer> map = getResults();
        ...
    }
}

Stringここでは、例としてandのキーと値の型を使用しIntegerました。Childキーと値のタイプが異なる場合は、ジェネリックにすることもできます。

class Child<K, V> extends Parent<HashMap<K, V>> { ... }

フィールドを初期化する方法を知りたい場合はresults、たとえばコンストラクターで行うことができます。

class Parent<T> {

    protected T results;

    Parent(T results) {
        this.results = results;
    }

    ...
}

class Child<K, V> extends Parent<HashMap<K, V>> {

    Child() {
        super(new HashMap<K, V>());
    }

    ...
}

いくつかの補足事項:

フィールドを作成した場合は、特にアクセサーがあるため、カプセル化の方が適しています。また、再割り当てが予定されていない場合は、作成することを検討してください。resultsprivategetResults()final

また、具体的にではなく、パブリック宣言で型を使用してインターフェイスするようにプログラミングすることをお勧めします。インスタンス化されたときにのみ、実装タイプ (この場合) を参照します。MapHashMapHashMap

class Child<K, V> extends Parent<Map<K, V>> {

    Child() {
        super(new HashMap<K, V>());
    }

    ...
}
于 2012-09-04T02:54:50.473 に答える