2013-12-13 151 views
3

對不起,另一個「Java通用方法不適用」的問題。我想知道我是什麼在我的理解缺失:通用方法不適用於參數

  1. List<E>Collection<E>
    亞型 - >意義,List<String>Collection<String>

  2. 假設A的亞型延伸B,List<A>不是List<B>的一個子類型
    - >但在這種情況下,只有一個類型T(或String),所以我沒有看到Substitution Princ我可以解釋我的問題嗎?

問題代碼

private <T, K> void genericAddToMapOfLists(HashMap<K, Collection<T>> mapOfLists, 
    K key, T value) { 
    if (mapOfLists.containsKey(key)) { 
     mapOfLists.get(key).add(value); 
    } else { 
     List<T> newList = new ArrayList<T>(); 
     newList.add(value); 
     mapOfLists.put(key, newList); 
    } 
} 

private void parseToFruitList(HashMap<String, List<String>> fruit_colors, 
     String fruitName) { 
    String color = ""; 
    genericAddToMapOfLists(fruit_colors, fruitName, color); 
} 

錯誤

The method genericAddToMapOfLists(HashMap<K,Collection<T>>, K, T) in the type MyGroceryStore is not applicable for the arguments (HashMap<String,List<String>>, String, String) 

當我改變了方法簽名genericAddToMapOfLists(HashMap<K,List<T>>, K, T)代碼工作。

+0

沒有必要在標題中添加主標籤。 –

回答

2

你說得對,「List<String>Collection<String>的子類型「。並且如果A延伸B,List<A>而不是List<B>的亞型。

再往前一步,HashMap<String, List<String>>不是HashMap<String, Collection<String>>

相同的推理適用,其中AListBCollection。如果HashMap<String, List<String>>HashMap<String, Collection<String>>,那麼你可以通過將其分配到一個HashMap<String, Collection<String>>put一個Vector<String>HashMap<String, List<String>>,即使Vector不是List,所以它是不允許的。

6

這正是你在第二點解釋的問題。

假設A延伸BList<A>不是List<B>

亞型在這種情況下,你的方法需要

HashMap<?, Collection<?>> 

,但你給它

HashMap<?, List<?>> 

List延伸Collection,但HashMap<?, List>不是HashMap<?, Collection>

亞型(我不使用?作爲通配符,我們只是不關心它現在)

相關問題