Java 在这种情况下如何声明和使用泛型映射

Java 在这种情况下如何声明和使用泛型映射,java,generics,Java,Generics,我有不同种类的地图键 class MapKeyParent{} class MapKeyOne<U> extends MapKeyParent{} class MapKeyOne<U,V> extends MapKeyParent{} 类MapKeyParent{} 类MapKeyOne扩展了MapKeyParent{} 类MapKeyOne扩展了MapKeyParent{} 我有一个类,其中有一组地图,可以保存这些键 class MapStorage{

我有不同种类的地图键

class MapKeyParent{}

class MapKeyOne<U> extends MapKeyParent{}

class MapKeyOne<U,V> extends MapKeyParent{}
类MapKeyParent{}
类MapKeyOne扩展了MapKeyParent{}
类MapKeyOne扩展了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);
    }
}
类映射存储{
Map[]映射数组;
公共地图存储(){
超级();
mapArray=
新的HashMap[NO_OF_秩];
mapArray[0]=新建HashMap();
mapArray[1]=新HashMap();
....
}
public void addToMap(int索引、MapKeyParent键、整数值)
{
mapArray[index].put(键,值);
}
公共整数getFromMap(int索引,MapKeyParent键)
{
返回mapArray[index].get(key);
}
}

如何在声明、放置和获取MapKeyParent时将泛型应用于MapStorage?

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

您可以通过使用
列表
并将其类型参数指定为
映射
来解决此问题

列表映射列表;
有关更详细的说明,请参阅

这需要您重构代码:

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);
    }
}
类映射存储{
列表地图列表;
公共地图存储(){
add(newhashmap());
add(newhashmap());
....
}
public void addToMap(int索引、MapKeyParent键、整数值)
{
mapList.get(index).put(key,value);
}
公共整数getFromMap(int索引,MapKeyParent键)
{
返回mapList.get(index).get(key);
}
}

我想您可能会问,根据对象的类型将对象粘贴到不同的地图中?如果是这样的话,可以尝试一个本身包含映射的Guava ClassToInstanceMap。顺便说一句,在java中,由于类型擦除,这样的事情很快就会变得非常复杂,因此您可能需要认真思考您正在尝试做什么,并找到一种不同的方法。
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);
    }
}