2012-02-28 260 views
6

我在下面的行中遇到錯誤。如何解決java中這種不兼容的類型?

error: incompatible types 
required : java.util.Map.entry<java.lang.String,java.lang.String[]> 
found :java.lang.Object   

完整的代碼如下

package com.auth.actions; 

public class SocialAuthSuccessAction extends Action { 

    final Log LOG = LogFactory.getLog(SocialAuthSuccessAction.class); 

    @Override 
    public ActionForward execute(final ActionMapping mapping, 
      final ActionForm form, final HttpServletRequest request, 
      final HttpServletResponse response) throws Exception { 

     AuthForm authForm = (AuthForm) form; 
     SocialAuthManager manager = null; 
     if (authForm.getSocialAuthManager() != null) { 
      manager = authForm.getSocialAuthManager(); 
     } 
     if (manager != null) { 
      List<Contact> contactsList = new ArrayList<Contact>(); 
      Profile profile = null; 
      try { 
       Map<String, String> paramsMap = new HashMap<String, String>(); 
       for (Map.Entry<String, String[]> entry :request.getParameterMap().entrySet()) { // error in this line! 
        String key = entry.getKey(); 
        String values[] = entry.getValue(); 
        paramsMap.put(key, values[0].toString()); // Only 1 value is 
       } 
       AuthProvider provider = manager.connect(paramsMap); 

       profile = provider.getUserProfile(); 
       contactsList = provider.getContactList(); 
       if (contactsList != null && contactsList.size() > 0) { 
        for (Contact p : contactsList) { 
         if (StringUtils.isEmpty(p.getFirstName()) 
           && StringUtils.isEmpty(p.getLastName())) { 
          p.setFirstName(p.getDisplayName()); 
         } 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      request.setAttribute("profile", profile); 
      request.setAttribute("contacts", contactsList); 

      return mapping.findForward("success"); 
     } 
     // if provider null 
     return mapping.findForward("failure"); 
    } 
} 

請幫

+1

什麼request.getParameterMap()返回? – mini 2012-02-28 08:51:31

+0

該行看起來不錯 - 你能發佈實際的堆棧跟蹤嗎? – DNA 2012-02-28 08:52:56

+0

'getParameterMap()'被定義[here](http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameterMap%28%29) – DNA 2012-02-28 08:53:49

回答

11

你需要投request.getParameterMap()Map<String, String[]>

for (Map.Entry<String, String[]> entry : 
    ((Map<String, String[]>)request.getParameterMap()).entrySet()) 
+1

你能解釋爲什麼演員需要? getParameter()給出一個Map ',所以'entrySet()'給出了一個'Set >',它允許迭代一個'Map.Entry <字符串,字符串[]>'。一切似乎都沒有鑄就好。 – 2012-02-28 08:53:33

+2

您可能正在使用JEE 5而不是JEE6。在JEE5中,getParameterMap()是無類型的,這意味着你得到一個Map 。請參閱http://docs.oracle.com/javaee/5/api/javax/servlet/ServletRequest.html – 2012-02-28 09:01:10

5

嘗試以下操作:

for (Object obj :request.getParameterMap().entrySet()) { 
       Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) obj; 
       String key = entry.getKey(); 
       String values[] = entry.getValue(); 
       paramsMap.put(key, values[0].toString()); // Only 1 value is 
      } 

我不太確定這會起作用,無論如何,你有辦法。希望這可以幫助。

2

由於pointed out在註釋中,getParameterMap()必須返回原始類型Map而不是Map<String, String[]>。這意味着getParameterMap().entrySet()返回原始的Iterable,導致編譯器錯誤。

如果你想避免做一個明確的投選中作爲其他的答案表明,另一種是使用未經檢查的轉換變量賦值:

@SuppressWarnings("unchecked") // getParameterMap returns raw Map 
Map<String, String[]> params = request.getParameterMap(); 
for (Map.Entry<String, String[]> entry : params.entrySet()) { 
    ... 
}