【发布时间】:2014-10-05 09:07:00
【问题描述】:
以下测试因
而失败java.util.LinkedHashMap cannot be cast to org.dabd.mapping2.MapperImplNGTest$Foo
java.lang.ClassCastException
at org.dabd.mapping2.MapperImplNGTest.testFromMap(MapperImplNGTest.java:82)
我能找到的唯一解决方案是将 fromMap 签名更改为T fromMap(S map, Class<T> clazz),但我认为没有必要显式传递该类。 TypeReference 的信息不足以实例化类型 T 吗?谢谢。
import java.util.Map;
public interface Mapper<T extends Object, S extends Map<String, Object>> {
public S toMap(T obj);
public T fromMap(S map);
}
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
public class MapperImpl<T extends Object, S extends Map<String, Object>>
implements Mapper<T, S> {
public S toMap(T obj) {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> map = objectMapper.convertValue(obj, Map.class);
return (S) map;
}
public T fromMap(S map) {
ObjectMapper objectMapper = new ObjectMapper();
T obj = objectMapper.convertValue(map, new TypeReference<T>() {
});
return obj;
}
}
测试
import java.util.HashMap;
import java.util.Map;
import static org.testng.Assert.*;
import org.testng.annotations.Test;
public class MapperImplNGTest {
public static class Foo {
private String a;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
}
public MapperImplNGTest() {
}
@Test
public void testFromMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("a", "aa");
MapperImpl<Foo, Map<String, Object>> mapper = new MapperImpl<Foo, Map<String, Object>>();
Foo foo = mapper.fromMap(map);
assertEquals(foo.getA(), map.get("a"));
}
}
【问题讨论】: