2012-02-15 64 views
1

我對Java中的泛型有點新。我遇到了以下情況,我不明白爲什麼代碼無法正常工作。將條目添加到地圖列表時出錯

List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>(); 
Map<String,String> entry = new HashMap<String,String>(); 
smsListEntry.put("1", "abc"); 
smsListEntry.put("2", "xyz"); 
listEntries.add(entry); 

它給了我,說像一個編譯時錯誤:

在類型List<capture#1-of ? extends Map<String,String>>方法add(capture#1-of ? extends Map<String,String>)是不適用的參數(Map<String,String>

+0

我在引用的錯誤消息中格式化了代碼片段。 '<' and '>'被默認解釋爲標記,除非您將它們格式化爲代碼(通過將它們放在反引號(')之間或將文本縮進4格)。 – 2012-02-15 11:52:42

+0

@PéterTörök - 我不知道。謝謝。 – 2012-02-15 12:08:29

回答

-1
List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>(); 

你應該寫爲

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 

你應該使用的條目接口定義列表類型。

,然後用它喜歡:

Map<String,String> entry = new HashMap<String,String>(); 
entry.put("1", "abc"); 
entry.put("2", "xyz"); 
listEntries.add(entry); 
listEntries.add(new LinkedHashMap<String, String>()); // if you want you can use different implementations of Map 
+0

我先試過。它提供了一個編譯時錯誤再次說:'CODETYPE不匹配:不能從轉換的ArrayList >爲List <地圖>' – 2012-02-15 11:47:39

+0

無法編譯,因爲'名單>'是**不是''List >'。 – 2012-02-15 11:48:21

+0

刪除「哈希」。 – 2012-02-15 11:48:32

2

試試這個。

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 
      Map<String,String> entry = new HashMap<String,String>(); 
      entry.put("1", "abc"); 
      entry.put("2", "xyz"); 
      listEntries.add(entry); 
      System.out.println(listEntries); 
+0

工作,謝謝! – 2012-02-15 11:55:58

3

試想一下,如果你改變了

Map<String,String> entry = new HashMap<String,String>(); 

Map<String,String> entry = new TreeMap<String,String>(); 

現在你已經添加了一個TreeMap到您的HashMapArrayList

溝通配符,並使用你真正想要的通用說法。

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>(); 

更新:爲了使這個更明確,攝像到ArrayList與原來的仿製藥的參考。

List<HashMap<String,String>> orig = new ArrayList<HashMap<String,String>>(); 
List<? extends Map<String, String>> listEntries = orig; 
listEntries.add(new TreeMap<>()); // Shouldn't work! 
HashMap<String,String> treeMap = orig.get(0); // Oops! 
+0

好吧,對不起,我在這裏有點困惑.'List <?擴展Map > listEntries = new ArrayList >()'。這個語句意味着我想要一個可以擴展map的任何對象的列表。它可以是HashMap或TreeMap或者只是一個Map。如果是這種情況,那麼行 - 'listEntries.add(entry); '必須工作,因爲entry是一個Map(雖然實現爲HashMap)。你能告訴我我的理解是哪裏搞亂了嗎? – 2012-02-15 12:04:41

+0

@Poornima Prakash你實際創建的是一個''ArrayList'''HashMap'。您仍然可以參考該對象。 – 2012-02-15 12:27:42

0

基本上,List<? extends Map<...>的意思是「我有限於含有某種類型的延伸Map名單,但我不知道確切的類型」。現在假設確切的類型實際上是TreeMap:有意義的是,您不能將HashMap放入此列表中。

一般來說,如果你有一些Type<E>和聲明Type<? extends X> var,你將永遠不會被允許調用了一個E作爲參數上var任何方法,因爲編譯器不能確定?允許什麼(也許X但也許只有一些亞型X)。這就是爲什麼你不能在這裏撥打add