7

我有一个采用Map<Integer, Set<Object>>as 参数的方法。我需要从两个不同的位置调用它,使用 aMap<Integer, Set<String>>和 aMap<Integer, Set<Integer>>作为参数。

编译器投诉所以我将方法参数签名更改为Map<Integer, ?>,现在我可以调用它,但是有不同的问题。方法基本如下:

private void methodA (Map<Integer, ?> inOutMap, Integer key, Object value) {

        Set<Object> list = new HashSet<Object>();

        if (!inOutMap.containsKey(key)) {
            list.add(value);
        } else {
            list = (Set<Object>) (Set<?>) inOutMap.get(key); //I wrote the cast, but looks quite ugly
            list.add(value);
        }

        inOutMap.put(key, list); //compiler error
        //The method put(Integer, capture#4-of ?) in the type Map<Integer,capture#4-of ?> is not applicable for the arguments (Integer, Set<Object>)
    }

有没有办法解决编译器错误?也就是说,投射list?.

我的第二个问题是概念性的。除了编写具有不同参数签名的两种不同方法之外,还有什么更好的方法吗?

4

3 回答 3

7

将其声明为

private <T> void methodA (Map<Integer, Set<T>> inOutMap, Integer key, T value) {

        Set<T> list = new HashSet<T>();

        if (!inOutMap.containsKey(key)) {
            list.add(value);
        } else {
            list = inOutMap.get(key); 
            list.add(value);
        }

        inOutMap.put(key, list); 
    }

当您尝试使用多种类型的参数时,使用泛型总是比使用Objector ?(unknown type)好

Set现在您可以使用包含不同类型的不同类型调用相同的方法,如下所示

Map<Integer, Set<String>> m1 = new HashMap<Integer, Set<String>>();
Map<Integer, Set<Integer>> m2 = new HashMap<Integer, Set<Integer>>();

methodA(m1, 1, "t");
methodA(m2, 2, 2);
于 2013-05-03T11:03:20.897 回答
1

这编译没有错误,也没有显式转换

private <T> void methodA (Map<Integer, Set<T>> inOutMap, Integer key, T value) {
    Set<T> list = new HashSet<T>();
    if (!inOutMap.containsKey(key)) {
        list.add(value);
    } else {
        list = inOutMap.get(key);
        list.add(value);
    }
    inOutMap.put(key, list);
}
于 2013-05-03T11:05:52.857 回答
0

你不能这样定义吗?

Map<Integer, Set<Object>>
于 2013-05-03T11:13:38.937 回答