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

9

我有一个与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);
}

这会导致编译错误。

我尝试了各种转换和通配符排列,但无法使其正常工作。我不记得以前看到过这个问题,而且我已经使用泛型工作多年了。是我太累了错过了一些显而易见的东西吗?


2
这个问题在Java泛型FAQ中有解释:http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ104 - Rag
3个回答

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) {}

是的,我刚刚独立意识到了这一点。我发誓昨天我试过了,但可能有其他细微的更改。 - nilskp

1

这个对你有用:

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

0

为了让代码正常工作,请创建HashMap:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接