java.lang.ClassCastException:java.util.HashMap $ EntrySet无法强制转换为java.util.Map $ Entry

时间:2015-08-05 12:18:59

标签: java dictionary

我有像这样的覆盖方法

@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方法

7 个答案:

答案 0 :(得分:6)

您正在尝试将一个集转换为单个条目。

您可以通过迭代集合来使用每个条目项目:

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
     */
}

答案 1 :(得分:4)

嗯,是的。

您正在尝试将Set<Map.Entry<String, String>>转换为单个Map.Entry<String, String>

您需要在集合中选择一个元素,或者迭代每个条目并对其进行处理。

以下内容:

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

答案 2 :(得分:3)

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)

答案 3 :(得分:1)

authentication.entrySet()Entry的集合。您可以像这样处理它们:

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

答案 4 :(得分:1)

如果我们想要返回一个特定的Entry(行),我们需要通过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());
}

答案 5 :(得分:1)

以下函数可作为一般迭代,设置,获取地图值的参考。

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

答案 6 :(得分:0)

我终于设法做到了,但是举步维艰,我真的不明白为什么这么复杂

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;

}

}