如何使用泛型类类型参数类

时间:2017-12-02 10:24:30

标签: java json generics jsonparser

我有遗传类参数

public static <T> T parse(String json, Class<T> clazz) {
   T result = null;
   result = mapper.readValue(json, clazz);

   return result;
}

假设我有一个json

{
    "name": "kim"
}

我应该如何为Class<T> clazz创建POJO?

public class Person<T>
{
    private T name;

    public T getName ()
    {
        return name;
    }

    public void setName (T name)
    {
        this.name = name;
    }


}

以及如何传递变量?

Person person = new Person();

parse(json, person) // ????

2 个答案:

答案 0 :(得分:0)

您可以尝试从这里开始。休息应根据您的要求流动。

public class Person<T>
{
    private T name;
    public T getName (){
        return name;
    }

    public void setName (T name){
        this.name = name;
    }

    public static void main(String[] args){
       Person<String> p = new Person<String>();
       p.setName("Some Name");
       System.out.println(p.getName());
    }

}

请参阅此页:https://docs.oracle.com/javase/tutorial/java/generics/types.html

答案 1 :(得分:0)

您的JSON建议您的对象的name属性为String。因此,您的对象看起来像

class Person {
    String name;
    // getter and setter
}

在这种情况下,没有理由让POJO具有通用性。您的上一个代码块也表明情况就是这样。只有在可以有不同的表示形式时,您才希望name为泛型类型。想一想List<T>如何使用其泛型类型。您是否希望Person<String>Person<StringBuilder>Person<MyObject>指定不同类型的name?可能不是。

通用用法确实在您的parse方法中发挥作用。 parse采用JSON StringClass类型,以告诉映射器从字符串创建哪个Java类:

public static <T> T parse(String json, Class<T> clazz)

也就是说,您使用Class类型T并返回T实例。用法是(而不是你的最后一个代码块):

Person person = parse(json, Person.class);

其中Person.classClass<Person>,这意味着该方法返回为Person