2009-06-06 32 views
5

Bir HashMap'teki verileri saklıyorum (anahtar: String, value: ArrayList). Sorun yaşıyorum yeni bir ArrayList "current" bildirir, "dictCode" dizesi için HashMap arar ve bulundu ise ArrayList döndürülen değer olarak geçerli olarak ayarlar. HashMap ArrayList yerine ben saklanan bir nesne döndürür olmadığını ... Ben bunu anlamıyorumHashMap (anahtar: String, value: ArrayList) ArrayList yerine bir nesne döndürür?

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

:

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

"Mevcut = ..." satırı bir derleyici hata verir İçinde değer olarak? Bu nesneyi bir ArrayList'e nasıl dönüştürebilirim?

Teşekkür ederiz.

+0

Sorunu açıklığa kavuşturmak için HashMap bildirimini ekleyin. – Jorn

cevap

33

HashMap bildirimi bu kapsamda nasıl ifade edilir? Aşağıdaki gibi olmalıdır: Nesneler olduğu varsayılmaktadır.

Örneğin, kod ise: çalışmaz

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

. Bunun yerine istiyorum:

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

yönlü jenerik iş türü bilgisi derleyici kullanılabilir olduğunu, ancak zamanında kullanılamaz. Buna tip silme denir. HashMap'in (veya diğer herhangi bir jenerik uygulaması) uygulanması Object ile ilgileniyor. Tip bilgisi, derleme sırasında tip güvenlik kontrolleri içindir. Generics documentation'a bakın. Ayrıca, ArrayList'un genel bir sınıf olarak uygulandığını ve bu nedenle orada da bir tür belirtmek isteyebileceğinizi unutmayın. senin ArrayList sınıf MyClass içeren varsayarak, yukarıdaki satır olabilir:

HashMap<String, ArrayList<MyClass>> dictMap 
2

Ben HashMap<Object, Object> varsayılan yapar senin dictMap tip HashMap ait olduğunu varsayalım. Daha spesifik olmanızı istiyorsanız, veya daha da iyisi, HashMap<String, ArrayList<T>>

+0

Teşekkürler ... ArrayList > bit ne yapıyor? – cksubs

+0

Bu, HashMap'teki parametrelerin String anahtar türünü ve Liste değeri türünü bildirdiği gibi ArrayList'teki nesnelerin türünü bildirir. Listedeki nesnelerin türü ile T'yi değiştirmelisiniz. – Jorn

2

Bildirmek Jeneriklerin kullanılması (yukarıdaki cevaplarda olduğu gibi) burada en iyi seçimdir. Sadece çift kontrol edilip ettik: jenerik sadece doğru veri oldukça alma zamanda işleme yapmaya çalışmak yerine, eklenir sağlamak gibi ben bunu tavsiye etmem aracılığıyla

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

yanı çalışacaktır.

2

HashMap ait get yöntemi bir Object dönüyor, ama değişken current bir ArrayList sürmesi bekleniyor: Bir ArrayList için yukarıdaki kod çalışması için

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

, Object döküm gerekir:

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

Ancak, muhtemelen daha iyi bir şekilde genel koleksiyon nesneleri ilk etapta kullanmak olacaktır:

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); 
} 

Yukarıdaki kod ArrayListObject s listesini sahip olduğu varsayılarak ve bundan gerekli değiştirilmelidir.

Genel bilgiler hakkında daha fazla bilgi için, Java Öğreticileri'nin bir lesson on generics vardır.

10
public static void main(String arg[]) 
{ 
    HashMap<String, ArrayList<String>> hashmap = 
     new HashMap<String, ArrayList<String>>(); 
    ArrayList<String> arraylist = new ArrayList<String>(); 
    arraylist.add("Hello"); 
    arraylist.add("World."); 
    hashmap.put("my key", arraylist); 
    arraylist = hashmap.get("not inserted"); 
    System.out.println(arraylist); 
    arraylist = hashmap.get("my key"); 
    System.out.println(arraylist); 
} 

null 
[Hello, World.] 

İyi çalışıyor ... belki de hatalarınızı kodumda bulabilirsiniz.