泛型类类型java

泛型类类型java,java,generics,Java,Generics,我想写一个将json映射到java的通用对象,因为需要插入 所以我在做下一个代码 public class JSONConverter<T> { public String getStringJSON(T obj{ ObjectMapper mapper = new ObjectMapper(); if(obj!=null){ try { return mapper.writeValue

我想写一个将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);

    }
}

它们使用一些自动方式,我希望有一个类与之类似

您需要将
作为参数添加到
getObject()
方法中,以便能够获取
T
的运行时
类型:

public T getObject(String stringJSON, Class<T> clazz){
    ObjectMapper mapper = new ObjectMapper();
    mapper.readValue(stringJSON, clazz);
}
public T getObject(字符串stringJSON,类clazz){
ObjectMapper mapper=新的ObjectMapper();
readValue(stringJSON,clazz);
}

另外,重新考虑对该方法的所有引用。

由于类型擦除,您不能这样做

可以做的是将泛型类型与接口绑定:

public class JSONConverter<T extends IMyInterface>

您甚至可以对实现
IMyInterface
的类进行注释,以便Jackson在反序列化时知道子类型

你不能那样做。典型地,类型作为参数传递:

public T getObject(String stringJSON, Class<T> clazz){
    ObjectMapper mapper = new ObjectMapper();
    mapper.readValue(stringJSON, clazz);
}

有时我会使用它来获取NPE,我不推荐使用它。

如果在类型定义中捕获了
t
的值,您可以通过以下方式检索它:

class StringConverter扩展了JsonConverter{/。。。
}
Class t=TypeResolver.resolveRawArgument(JsonConverter.Class,StringConverter.Class);
断言t==String.class;

此代码是否编译?否,OP请求帮助使其编译(并正常工作)。您能否演示如何使用您声称的反射来获得T.class?完成。我坚持认为,根据经验,这些方法是不可靠的。
mapper.readValue(stringJSON, IMyInterface.class);
public T getObject(String stringJSON, Class<T> clazz){
    ObjectMapper mapper = new ObjectMapper();
    mapper.readValue(stringJSON, clazz);
}
  private Class<T> type = (Class<T>) ((ParameterizedType) getClass()
            .getGenericSuperclass())
            .getActualTypeArguments()[0];
class StringConverter extends JsonConverter<String> { //...
}

Class<?> t = TypeResolver.resolveRawArgument(JsonConverter.class, StringConverter.class);
assert t == String.class;