gpt4 book ai didi

java - 将 TypeReference 与 Jackson 一起使用

转载 作者:行者123 更新时间:2023-11-30 09:01:52 27 4
gpt4 key购买 nike

下面的测试失败了

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)但我认为没有必要明确地通过类(class)。 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"));

}

}

最佳答案

不,您不能通过 TypeReference 以这种方式使用像 T 这样的类型变量:您必须传递实际的参数化。这是因为这里没有任何与 T 关联的运行时信息:它只是一个占位符。因此它被有效地视为 java.lang.Object

但您可以使用 TypeFactory(可通过 ObjetMapper.getTypeFactory() 获取实例)以编程方式构建结构化类型。您仍然需要代表键和值类型的 Class 实例,但是使用此信息可以构造包含您需要的完整类型信息的 JavaType 值。

关于java - 将 TypeReference 与 Jackson 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26201183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com