2012-02-28 30 views
6

otrzymuję błąd w następujących liniach.Jak rozwiązać ten niekompatybilny typy w java?

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

pełny kod jest poniżej

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

Proszę o pomoc

+1

co request.getParameterMap() zwraca? – mini

+0

Ta linia wygląda OK - czy możesz opublikować rzeczywisty ślad stosu? – DNA

+0

'getParameterMap()' jest zdefiniowane [tutaj] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameterMap%28%29) – DNA

Odpowiedz

11

Trzeba rzucić request.getParameterMap() do Map<String, String[]>

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

Czy możesz wyjaśnić, dlaczego obsada jest potrzebna? 'getParameter()' daje 'Map ', więc 'entrySet()' daje 'Set >', który pozwala na iterację z 'Map.Entry < String, String []> '. Wszystko wygląda dobrze bez rzucania. –

+2

Prawdopodobnie pracę z JEE 5 i nie JEE6. W JEE5, getParameterMap() jest nietknięty, co oznacza, że ​​otrzymujesz Mapę . Zobacz tutaj http://docs.oracle.com/javaee/5/api/javax/servlet/ServletRequest.html –

5

Spróbuj wykonać następujące czynności:

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 
      } 

nie jestem pewien, że to zadziała, tak, masz podejście. Mam nadzieję że to pomoże.

2

W komentarzach pointed out w komentarzach musi być zwracany surowy typ Map zamiast Map<String, String[]>. Oznacza to getParameterMap().entrySet() zwraca surowe Iterable, powodując błąd kompilatora.

Jeśli chcesz uniknąć robi wyraźne niezaznaczone obsady jak inne odpowiedzi sugerują, alternatywą jest użycie zmiennej przypisania niesprawdzony konwersji:

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