使用泛型将泛型类型的对象添加到地图中

时间:2014-12-23 16:06:35

标签: java generics

我有三张地图:

Map<Integer,ArrayList<ItemType1>> map1;
Map<Integer,ArrayList<ItemType2>> map2; 
Map<Integer,ArrayList<ItemType3>> map3; 

我经常想要在地图中查找一个键并向其添加一个项目的ArrayList值。我想创建一个方法,将map Map<Integer,ArrayList<T>>(具有通用类型T的ArrayList值),要添加的键以及要添加到该映射的T类型的项作为参数。 / p>

理论上是这样的(我知道这不是Java代码):

private void addToListInMap(Map<Integer,ArrayList<T>> map,Integer keyValue, T itemToAdd){
    ArrayList<T> listOfItems= map.get(keyValue);
    if(listOfItems == null){
       listOfItems= new ArrayList<T>();
       map.put(keyValue, listOfItems);
    }
    listOfItems.add(itemToAdd);
}

如何使用泛型来实现这样的效果?

2 个答案:

答案 0 :(得分:5)

这并不是非常困难:将泛型类型作为方法的类型参数提供。

缺少的所有代码都是它的类型参数。然后,它应该“正常工作”。

private <T> void addToListInMap(Map<Integer, ArrayList<T>> map,
                               Integer keyValue, T itemToAdd) {
    ArrayList<T> listOfItems = map.get(keyValue);
    if (listOfItems == null) {
        listOfItems = new ArrayList<T>();
        map.put(keyValue, listOfItems);
    }
    listOfItems.add(itemToAdd);
}

答案 1 :(得分:4)

您需要输入方法,因此方法中的代码可以访问它(以创建新列表)。

private static <T> void addToListInMap(Map<Integer,ArrayList<T>> map, Integer keyValue, T itemToAdd {
    ArrayList<T> listOfItems = map.get(keyValue);
    if (listOfItems == null) {
       listOfItems = new ArrayList<T>();
       map.put(keyValue, listOfItems);
    }
    listOfItems.add(itemToAdd);
}

我也使用了方法static,因为它不需要访问任何字段来工作。

您还应考虑将值List<T>的类型设为ArrayList<T>而不是{{1}} - 请参阅Liskov substitution principle