2012-04-26 33 views
0

這裏是我的問題: 我的功能在A級:如何使用通配符將泛型傳遞給函數而不用轉換?

public void setData(Map<String,? extends ArrayList<? extends SomeInterface>>){...} 

我的電話:

Map<String, ArrayList<ImplementsSomeInterface>> a=...; 
instanceOfA.setData(a); //does not compile 
instanceOfA.setData((Map<String,? extends ArrayList<? extends SomeInterface>>) a); // works thanks to the Casting. 

我不認爲這是乾淨的。有沒有一種方法可以避免在不丟棄通配符的情況下使用該函數?

+0

是A類普通? A類聲明是什麼樣的? – claesv 2012-04-26 13:36:42

+0

你的意思是什麼?運行時沒有ClassCastException?什麼是subClassOfSomeClass? – assylias 2012-04-26 13:36:45

+2

如果'subClassOfSomeClass'不是任何東西的ArrayList,這個如何工作? – sinelaw 2012-04-26 13:37:28

回答

3

首先你setData方法應爲:

public void setData(Map<String,? extends List<? extends SomeInterface>>) 

你映射聲明應改爲:

Map<String, List<ImplementsSomeInterface>> a = ...; 

,這是相當多的,你已經得到了你的以下修改原來的問題是什麼。我從ArrayListList所做的更改不會影響代碼的行爲。

以下意見:

public static void main() 
{ 
    Map<String, List<Double>> map = new HashMap<String, List<Double>>(); 
    map.put("prices", new ArrayList<Double>(Arrays.asList(1.1, 2.2, 3.3))); 

    setData(map); 
} 

public static void setData(Map<String,? extends List<? extends Serializable>> map)  
{ 
} 
+0

假設我使用'public void setData(Map >)'我仍然必須在調用中強制轉換參數,如下所示'instanceOfA.setData((Map >)a);'有沒有辦法避免投射? – giscope 2012-04-26 13:52:43

+0

不是在我使用的Java 1.6版本中,我試過了:-)我會將代碼添加到我的答案中。 – 2012-04-26 14:06:36

+0

優秀。謝謝 – giscope 2012-04-26 14:17:13

1

的問題是,使用setData帶一個參數一個 Map<String,? extends ArrayList<? extends SomeClass>>地圖> 而在你的第一個呼叫(將一個不編譯)你想傳遞一個Map<String,? extends SomeClass>

JAVA可以自動施放子類 SomeClassArrayList<? extends SomeClass> 的子類,因爲它不是一個ArrayList的實例。

+1

我的錯誤。我誤打了電話。我編輯我的問題 – giscope 2012-04-26 13:50:50

相關問題