在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;
}
答案 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();
...
}
}
我在这里使用了String
和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>());
}
...
}
一些旁注:
如果您创建results
字段private
,encapsulation会更好,特别是因为它无论如何都有访问者getResults()
。另外,如果它不会被重新分配,请考虑将其设为final
。
此外,我建议您在公开声明中使用Map
类型而不是HashMap
专门使用programming to interface。在实例化时仅引用实现类型(在这种情况下为HashMap
):
class Child<K, V> extends Parent<Map<K, V>> {
Child() {
super(new HashMap<K, V>());
}
...
}