同时扩展HashMap和LinkedHashMap?

时间:2017-03-10 18:21:50

标签: java inheritance interface hashmap

我想扩展HashMap以添加方法putIfGreaterThan,它基本上检索给定键的值,如果新值大于旧值,我们使用新值更新旧值。像这样:

  public void putIfGreaterThan(String key, Double value )
  {

  if (containsKey(key ) != true) {
  put( key , value );
  } else {
  if (get(key ) < value) {
  System. out .println("Adding new value: " + value + " to map" );
  put( key , value );
  } else {
  System. out .println("Did not add value: " + value + " to map" );
  }
  }


  }

上述程序运行正常 - 但我想将此方法添加到HashMapLinkedHashMap。换句话说,如果有人实例化:

HashMap hashmap = new HashMap();

他们应该能够访问该方法:

hashmap.putIfGreaterThan();

如果有人实例化:

LinkedHashMap linkedhashmap = new LinkedHashMap();

他们应该能够访问该方法:

linkedhashmap .putIfGreaterThan();

如果我按如下方式创建一个新类:

MyHashMap extends HashMap<String, Double>并添加前面提到的方法 - 我只展开HashMap而不是LinkedHashMap。如果我实例化LinkedHashMap

,这将不允许我访问该方法

我正在考虑修改原始HashMap类中的源代码(通过添加方法putIfGreaterThan)但是我无法修改源代码,除非我对整个类进行反编译(当我尝试执行时)我得到了一堆其他错误,所以我认为扩展HashMap类会更容易,但这样做意味着我无法在putIfGreaterThan和{{1}上使用方法HashMap }})。

此外,如果我已将方法添加到原始类,则可以在任何LinkedHashMap上调用此方法(即使映射包含两个字符串),但该方法仅适用于包含的HashMap String和Double或String和Int。因此,我认为扩展原始类并使用与HashMap String和Double相关的方法自定义当前类更有意义。

有什么建议吗?

由于

3 个答案:

答案 0 :(得分:2)

让你的自定义地图改为实现Map接口,然后用它通过构造函数提供由类用户提供的具体地图:

public class MyMap implements Map<String, Double>{
    private final Map<String, Double> map;  

    public MyMap(Map<String, Double> map){
        this.map = map;
    }

    public void putIfGreaterThan(String key, Double value ){...}

    @Override
    public int size() {
        return map.size();
    }

    //inherited methods
}

这个类可以像这样使用:

MyMap map = new MyMap(new LinkedHashMap<>());

或:

MyMap map = new MyMap(new HashMap<>());

答案 1 :(得分:0)

Java不支持多继承,但您可以使用Interfaces完成。

Java Multiple Inheritance

答案 2 :(得分:0)

您无法将方法添加到现有的HashMap或LinkedHashMap类。 唯一的方法是创建一个自定义类MyHashMap<K,V>,它实现Map接口并将您的逻辑放在那里,并使用HashMap和(或)LinkedHashMap组成该类,并让您的客户在MyHashMap上运作。