2009-06-06 23 views
5

Sto memorizzando i dati in una HashMap con (chiave: String, valore: ArrayList). La parte che ho problemi con dichiara un nuovo ArrayList "corrente", cerca HashMap per la stringa "dictCode" e se i set trovati sono correnti come il valore restituito ArrayList.HashMap (chiave: String, valore: ArrayList) restituisce un oggetto anziché ArrayList?

ArrayList current = new ArrayList();  
if(dictMap.containsKey(dictCode)) { 
    current = dictMap.get(dictCode); 
} 

La "corrente = ..." linea restituisce un errore di compilazione di:

Error: incompatible types 
found : java.lang.Object 
required: java.util.ArrayList 

Non capisco questo ... non che HashMap restituire un oggetto al posto del ArrayList ho conservato in esso il valore? Come posso convertire questo oggetto in ArrayList?

Grazie.

+0

aggiungere la dichiarazione HashMap per chiarire la domanda. – Jorn

risposta

33

Come viene espressa la dichiarazione HashMap in tale ambito? Dovrebbe essere:

HashMap<String, ArrayList> dictMap 

In caso contrario, si presume che siano oggetti.

Per esempio, se il codice è:

HashMap dictMap = new HashMap<String, ArrayList>(); 
... 
ArrayList current = dictMap.get(dictCode); 

che non funzionerà. Invece si vuole:

HashMap<String, ArrayList> dictMap = new HashMap<String, Arraylist>(); 
... 
ArrayList current = dictMap.get(dictCode); 

Il modo più generici lavoro è che le informazioni sul tipo è disponibile per il compilatore, ma non è disponibile in fase di esecuzione. Questo si chiama cancellazione di tipo. L'implementazione di HashMap (o di qualsiasi altra implementazione generica) ha a che fare con Object. Le informazioni sul tipo sono disponibili per i controlli di sicurezza del tipo durante la compilazione. Vedi lo Generics documentation.

Si noti inoltre che ArrayList è anche implementato come classe generica, pertanto è possibile che si desideri specificare anche un tipo. Assumendo che il ArrayList contiene la classe MyClass, la linea di cui sopra potrebbe essere:

HashMap<String, ArrayList<MyClass>> dictMap 
2

Suppongo che la vostra dictMap è di tipo HashMap, che lo rende di default di HashMap<Object, Object>. Se vuoi che sia più specifico, dichiaralo come HashMap<String, ArrayList>, o meglio ancora, come HashMap<String, ArrayList<T>>

+0

Grazie ... cosa fa il bit ArrayList >? – cksubs

+0

Dichiara il tipo di oggetti in ArrayList, proprio come i parametri in HashMap dichiarano il tipo di chiave String e il tipo di valore List. È necessario sostituire T con il tipo di oggetti nell'elenco – Jorn

2

L'uso di generici (come nelle risposte precedenti) è la soluzione migliore qui. Ho appena ricontrollato e:

test.put("test", arraylistone); 
    ArrayList current = new ArrayList(); 
    current = (ArrayList) test.get("test"); 

funzionerà pure, attraverso io non lo consiglio come i generici garantiscono che viene aggiunto solo i dati corretti, piuttosto che cercare di fare la manipolazione in fase di recupero.

2

Il metodo della HashMapget restituisce un Object, ma la variabile current è prevista per un ArrayList:

ArrayList current = new ArrayList(); 
// ... 
current = dictMap.get(dictCode); 

Per il codice precedente funzioni, il Object essere rigettati a un ArrayList:

ArrayList current = new ArrayList(); 
// ... 
current = (ArrayList)dictMap.get(dictCode); 

Tuttavia, probabilmente il modo migliore sarebbe utilizzare gli oggetti di raccolta generici in primo luogo:

HashMap<String, ArrayList<Object>> dictMap = 
    new HashMap<String, ArrayList<Object>>(); 

// Populate the HashMap. 

ArrayList<Object> current = new ArrayList<Object>();  
if(dictMap.containsKey(dictCode)) { 
    current = dictMap.get(dictCode); 
} 

Il codice precedente è supponendo che il ArrayList ha una lista di Object s, e che deve essere cambiata come necessario.

Per ulteriori informazioni sui generici, The Java Tutorials ha un lesson on generics.

10

Funziona bene ... forse trovi il tuo errore nel mio codice.

Problemi correlati