2015-04-20 50 views
-1

這裏的代碼片段的問題是與subkey.Keyset,它「類型不匹配:不能從元素類型的對象發展到字符串」類型不匹配:不能從元素類型的對象發展到字符串

for(String msgtype : subkey.keySet()){ 
    int time = ((Integer)subkey.get(msgtype)).intValue(); 
    time--; 

    if(time > 0){ 
     newsubkey.put(msgtype, Integer.valueOf(time)); 
    } 
} 

高於此位低於在錯誤由「subkey.keySet代碼的一部分

public void run(){ 
    if(this.running){ 
     return; 
    } 
    this.running = true; 

    while(this.running){ 
     synchronized(LOCK){ 
      if(msglist.size() != 0){ 
       @SuppressWarnings("rawtypes") 
       HashMap newmsglist = new HashMap(); 

       for(String player : msglist.keySet()){ 
        @SuppressWarnings("rawtypes") 
        HashMap subkey = (HashMap)msglist.get(player); 

        @SuppressWarnings("rawtypes") 
        HashMap newsubkey = new HashMap(); 

        for(String msgtype : subkey.keySet()){ 
         int time = ((Integer)subkey.get(msgtype)).intValue(); 
         time--; 

         if(time > 0){ 
          newsubkey.put(msgtype, Integer.valueOf(time)); 
         } 
        } 

        if(newsubkey.size() > 0){ 
         newmsglist.put(player, newsubkey); 
        } 
       } 

       msglist = newmsglist; 
      } 
     } 

     if(this.running){ 
      try{ 
       sleep(this.sleepTime * 1000); 
      }catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 

    this.running = false; 
} 
+0

甲'.keySet()'返回一個Java'Set';你的密鑰必須是字符串類型 –

+0

所以subKey中的鍵不是字符串......你的問題到底是什麼? – Manu

+0

非常新的java只需要知道如何修復錯誤@Machina – Noongrboy

回答

1

不抑制警告:

@SuppressWarnings("rawtypes") 
HashMap subkey = (HashMap)msglist.get(player); 

你可以在這裏有效地說:「讓我們假設子鍵是從對象到對象的映射。」

兩行後面,你期望得到String鍵。

難怪編譯器感到困惑。

+0

好吧,對不起,我已經解決了這個問題現在我有一個它說的方法getInstance()是未定義的類型MsgThread @Ingo – Noongrboy

0

首先,不要壓制警告!他們在那裏幫助你避免像你在這裏製造的那樣的錯誤。

HashMap是一個標準的java集合對象,允許將任意類型的元素(稱爲鍵)映射到另一組任意可定義類型(稱爲值)的元素。

儘管實際的映射過程基於對象散列,但將泛型鍵映射到任意類型化鍵的能力最終將由泛型提供支持。如果你不知道他們是什麼,我建議你read here

歸結到的是,如果未指定,HashMap將映射Object鍵到Object值。雖然這個HashMap在技術上將在映射方面具有全面性,但是當您將元素放入HashMap(它們存儲在非常模糊的地方,作爲Object類型的元素)時,您將丟失類型信息。

當你試圖獲取地圖的按鍵,並使用循環增強的迭代它時,編譯器意識到它不能安全地轉換Object類型的一組個人String對象(即Object不等於或String的子類)強制編譯器拋出所述錯誤。

要解決,所有你需要做的就是指定一個更具體的類型到HashMap中,像這樣:

HashMap<String, Integer> subkey; 

或在您的情況:

HashMap<String, Integer> subkey = msglist.get(player); 

假設msglist是與地圖type signature Map<String, HashMap<String, Integer>>

or:

HashMap<String, Integer> subkey = (HashMap<String, Integer>) msglist.get(player); 

如果msglist是與類型簽名的地圖Map<String, Object>

+0

非常感謝你把時間花在了這個意義上:D真的很感激,如果你可以看看我的這個https://github.com/kalo121/Issuekalo/tree/master並告訴我爲什麼getInstance表示方法getInstance()對於MsgThread類型是未定義的,我將如何去定義它? @CPU Terminator – Noongrboy

+0

@Noongrboy雖然在這個問題上完全不在話題中,但我確實看了一下你的代碼,我無法在任何地方找到聲明或導入語句(MsgThread)。我根本無法確定或甚至推斷出它的對象類型,因此無法幫助你。如果它是您自己創建的某個類,請嘗試自己調試該類,如果您真的陷入困境,請將其作爲單獨的問題發佈。 **包括**相關部分的代碼,**專門描述**你的問題,**表明**已經爲解決手頭問題做出了努力。 – initramfs

+0

好吧感謝兄弟@CPU終結者 – Noongrboy

相關問題