我在Java泛型中遇到了有界嵌套通配符的问题.
这是一个常见的案例:
public void doSomething(Set<? extends Number> set) {}
public void callDoSomething() {
Set<Integer> set = new HashSet<Integer>();
doSomething(set);
}
这是标准的Java泛型,工作正常.
但是,如果通配符变为嵌套,则它不再起作用:
public void doSomething(Map<String, Set<? extends Number>> map) {}
public void callDoSomething() {
Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>();
doSomething(map);
}
这会导致编译器错误.
我尝试了各种演员表和通配符排列,但我无法使其正常工作.我不记得以前看过这个问题了,多年来我一直在使用仿制药.我是否太累了,错过了一些明显的东西?
解决方法:
所以问题是,doSomething可以实现为:
public void doSomething(Map<String, Set<? extends Number>> map) {
Set<Float> set = ...;
map.put("xyz", set);
}
你需要决定你的意思.
可能是这样的:
public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}