2010-08-04 65 views
8

我在Java泛型中有一個有界嵌套通配符的問題。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); 
} 

這導致了一個編譯錯誤。

我試過各種各樣的強制轉換和通配符排列,但是我無法得到這個工作。我不記得之前看到過這個問題,而且我已經與仿製藥合作了多年。我是否太累了,錯過了一些明顯的東西?

+0

有一個解釋此在Java泛型常見問題中:http://www.angelikalanger.com/GenericsFAQ/FAQSections /TypeArguments.html#FAQ104 – 2014-12-11 23:27:54

回答

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

是的,我只是獨立意識到這一點。我可以發誓我昨天試過,但我可能有一些其他微妙的變化。 – nilskp 2010-08-04 13:34:52

0

使代碼工作創建的HashMap爲:

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

這會爲你工作:

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