Java嵌套通配符泛型将无法编译

时间:2010-08-04 13:15:42

标签: java generics nested wildcard

我在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);
}

这会导致编译错误。

我尝试了各种演员表和通配符排列,但我无法使其正常工作。我不记得以前看过这个问题了,多年来我一直在使用仿制药。我是否太累了,错过了一些明显的东西?

3 个答案:

答案 0 :(得分:15)

问题是,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) {}

答案 1 :(得分:1)

这对你有用:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}

答案 2 :(得分:0)

使代码工作创建HashMap为:

Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>();