[英]Generic class type java
我想写一个通用的 object 映射 json 到 java,因为需要插入。
所以我正在制作下一个代码
public class JSONConverter<T> {
public String getStringJSON(T obj{
ObjectMapper mapper = new ObjectMapper();
if(obj!=null){
try {
return mapper.writeValueAsString(obj);
} catch (IOException e) {
}
}
//mapper.writeValueAsString(obj);
}
public T getObject(String stringJSON){
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(stringJSON, T.class);
}
}
但我的问题是 T.class 不起作用,我怎样才能获得一个通用值的 class ? because if i put getObject(String stringJSON, class<T> clazzT)
i have to add always class and if i put like a property class clazzT in the object i will have a null pointerException.
那么我该如何解决这个问题,只使用 object 之类的转换器的定义?
我看到在 REST 的一些实现中,比如 easyRest 和 CXF,他们使用 Class 类型来进行字符串和 Object 之间的转换,比如
@POST
@Path("/")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response someService(SomeClass obj)
他们使用一些自动方式,我想要一个类似的 class
您需要将Class<T>
作为参数添加到getObject()
方法,以便能够获取T
的运行时Class
类型:
public T getObject(String stringJSON, Class<T> clazz){
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(stringJSON, clazz);
}
此外,重新考虑对该方法的所有引用。
你不能,因为类型擦除。
您可以做的是将泛型类型与接口绑定:
public class JSONConverter<T extends IMyInterface>
然后你可以反序列化为:
mapper.readValue(stringJSON, IMyInterface.class);
您甚至可以注释实现IMyInterface
的类,以便 Jackson 在反序列化时知道子类型。
你不能那样做。 通常,类型作为参数传递:
public T getObject(String stringJSON, Class<T> clazz){
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(stringJSON, clazz);
}
实际上,有一种方法可以通过反射获得 T.class 运行时,但我不推荐你。
编辑
在运行时获取T.class
:
private Class<T> type = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass())
.getActualTypeArguments()[0];
有时我会使用它来获得 NPE,我不推荐它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.