我有一个以Map<Integer, Set<Object>>
为参数的方法。我需要使用Map<Integer, Set<String>>
和Map<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
投射到?
。
我的第二个问题是概念性的。除了使用不同的参数签名编写两种不同的方法之外,还有更好的方法吗?
答案 0 :(得分: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);
}
当您尝试使用多种类型的参数时,使用泛型总是好的,而不是使用Object
或?
(未知类型)
现在,您可以使用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);
答案 1 :(得分: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);
}
答案 2 :(得分:0)
你不能这样定义吗?
Map<Integer, Set<Object>>