在这种情况下如何声明和使用通用映射

时间:2013-11-22 21:01:20

标签: java generics

我有不同类别的地图键

class MapKeyParent{}

class MapKeyOne<U> extends MapKeyParent{}

class MapKeyOne<U,V> extends MapKeyParent{}

我有一个类,其中有一组可以容纳这些键的地图,

class MapStorage{
    Map<MapKeyParent, Integer>[] mapArray;

    public MapStorage() {
    super();
    mapArray= 
        new HashMap<MapKeyParent, Integer>[NO_OF_RANKS];

    mapArray[0] = new HashMap<MapKeyParent, Integer>();
    mapArray[1] = new HashMap<MapKeyParent, Integer>();
    ....
    }

    public void addToMap(int index, MapKeyParent key, Integer value )
    {
       mapArray[index].put(key, value);
    }

    public Integer getFromMap(int index, MapKeyParent key)
    {
       return mapArray[index].get(key);
    }
}

如何在声明,放置和获取时将Generics应用于MapSeyParent的MapStorage?

1 个答案:

答案 0 :(得分:1)

数组不能具有参数化类型的组件类型。在运行时,由于类型擦除,参数化类型将丢失泛型类型信息。这将允许将实现Map接口的任何对象添加到数组中。

您可以使用List并将其类型参数指定为Map<MapKeyParent, Integer>来解决此问题。

List<Map<MapKeyParent, Integer>> mapList;

有关更详细的说明,请参阅Generic Faq

这需要您重构代码:

class MapStorage{
    List<Map<MapKeyParent, Integer>> mapList;

    public MapStorage() {
       mapList.add(new HashMap<MapKeyParent, Integer>());
       mapList.add(new HashMap<MapKeyParent, Integer>());
    ....
    }

    public void addToMap(int index, MapKeyParent key, Integer value )
    {
       mapList.get(index).put(key, value);
    }

    public Integer getFromMap(int index, MapKeyParent key)
    {
       return mapList.get(index).get(key);
    }
}