簡體   English   中英

java.lang.ClassCastException: java.util.HashMap$EntrySet 不能轉換為 java.util.Map$Entry

[英]java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.Map$Entry

我有一個像這樣的重寫方法

@Override
public Build auth (Map.Entry<String, String> auth) {
            this.mAuth = auth;
            return this;
}

這里我嘗試通過以下方式調用此方法

Map<String, String> authentication = new HashMap<String , String> ();        
         authentication.put("username" , "testname");
         authentication.put("password" , "testpassword");        

Map.Entry<String, String> authInfo =(Entry<String , String>) authentication.entrySet();

AuthMethod.auth(authInfo)

在運行時,我得到

java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.Map$Entry

我如何將Map.Entry<String, String>傳遞給 auth 方法

您正在嘗試將集合轉換為單個條目。

您可以通過迭代集合來使用每個條目項:

Iterator it = authentication.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry entry = (Map.Entry)it.next(); //current entry in a loop
    /*
     * do something for each entry
     */
}

嗯,是。

您正在嘗試將Set<Map.Entry<String, String>>為單個Map.Entry<String, String>

您需要在集合中選擇一個元素,或者迭代每個條目並對其進行處理。

在以下方面的東西:

for (Map.Entry<String, String> entry: authentication.entrySet()) {
    // TODO logic with single entry
}
Map.Entry<String, String> authInfo =(Entry<String, String>) authentication.entrySet();

在這里你做錯了演員表。 您提到的 auth 方法似乎只需要用戶名/密碼對的值。 所以像下面這樣的事情會做:

Map<String, String> authentication = new HashMap<String, String>();         
authentication.put("testname", "testpassword");
Map.Entry<String, String> authInfo = authentication.entrySet().iterator().next();
AuthMethod.auth(authInfo)

authentication.entrySet()Entry的集合。 您可以像這樣處理它們:

   authentication.entrySet().stream().map(x->auth(x)).collect(Collectors.toList())

如果我們想返回一個特定的 Entry(row),我們需要通過 iterator.next() 迭代第一個條目:

Map.Entry<String, String> authInfo = (Entry<String, String>)   
authentication.entrySet().iterator().next();

如果我們想遍歷地圖,我們需要保持這樣的循環:

for( Map.Entry<String, String> authInfo : authentication.entrySet()){
    System.out.println("authInfo:"+authInfo.getKey());
}

下面的函數可以作為通用迭代、設置、獲取地圖值的參考。

(Iterator<Entry> i = entries.iterator(); i.hasNext(); ) {
    Map.Entry e = (Entry) i.next(); 
    if(((String)e.getValue())==null ){
        i.remove();
    } else {
        e.setValue("false");
    }
    System.out.println(e.getValue());
}

我終於設法做到了,但方法很巧妙,我真的不明白為什么它如此復雜

package utils;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TreeTraversingParser;

import models.Product;
import play.Logger;
import play.libs.Json;

public class ProductDeserializer extends JsonDeserializer<List<Product>>{


@Override
public List<Product> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

    Map.Entry<String,ObjectNode> map;
    try {   

    TreeTraversingParser parser=(TreeTraversingParser)p;
    Class ftClass = parser.getClass();
    Field nodeCursor = ftClass.getDeclaredField("_nodeCursor");
    boolean nodeCursorAccessible=nodeCursor.isAccessible();
    // Allow modification on the field
    nodeCursor.setAccessible(true);
    Class nodeClass =nodeCursor.get(parser).getClass();
    Field content = nodeClass.getDeclaredField("_current");
    boolean contentAccessible=content.isAccessible();
    content.setAccessible(true);
    map=(Map.Entry<String,ObjectNode>)content.get(nodeCursor.get(parser));
    ObjectNode ob=map.getValue();   
    nodeCursor.setAccessible(nodeCursorAccessible);
    content.setAccessible(contentAccessible);

    return Json.mapper().readValue(ob.get("order_rows").traverse(), new TypeReference<List<Product>>(){});
}catch(Exception e) {
    Logger.error("could not map product for this order"+p.getCurrentValue().toString());
}
    return null;

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM