2012-02-28 263 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()) { 
    ... 
}