繁体   English   中英

通用 class 类型 java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM