在Java中,如何覆盖继承类中变量的类类型?

时间:2012-09-04 02:50:02

标签: java

在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;
}

1 个答案:

答案 0 :(得分:8)

您可以使用generics来实现此目标:

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();
        ...
    }
}

我在这里使用了StringInteger的键和值类型作为示例。如果密钥和值类型不同,您还可以使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>());
    }

    ...
}

一些旁注:

如果您创建results字段privateencapsulation会更好,特别是因为它无论如何都有访问者getResults()。另外,如果它不会被重新分配,请考虑将其设为final

此外,我建议您在公开声明中使用Map类型而不是HashMap专门使用programming to interface。在实例化时仅引用实现类型(在这种情况下为HashMap):

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

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

    ...
}