![](/img/trans.png)
[英]java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.HashSet
[英]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.