Java-将类型传递给超类静态方法

use*_*216 6 java generics inheritance types

假设我有一个简单的课程:

public class TestClass
{
    public String field1 = "Field1";
    public String field2 = "Field2";
    public String field3 = "Field3";
}
Run Code Online (Sandbox Code Playgroud)

我的项目中有多个pojo类,我希望能够将每个对象序列化为json。因此,我创建了新Serializer类(用于序列化的gson):

public class Serializer
{
    public String toJson()
    {
        return new Gson().toJson(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的示例类扩展了Serializer

public class TestClass extends  Serializer
{
    public String field1 = "Field1";
    public String field2 = "Field2";
    public String field3 = "Field3";
}
Run Code Online (Sandbox Code Playgroud)

而且我可以Serializer通过调用toJson方法来序列化扩展类的任何对象,如下所示:

TestClass test1 = new TestClass();
String json =  test1.toJson();
Run Code Online (Sandbox Code Playgroud)

现在我想通过调用静态方法来构造类对象fromJson。所以我TestClass看起来像这样:

public class TestClass extends  Serializer
{
    public String field1 = "Field1";
    public String field2 = "Field2";
    public String field3 = "Field3";

    public static TestClass fromJson(String json)
    {
        return new Gson().fromJson(json, new TypeToken<TestClass>() {}.getType());
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我可以通过调用以下命令创建新对象:

TestClass test2 = TestClass.fromJson(json);
Run Code Online (Sandbox Code Playgroud)

当然,这不是一个好方法,因为我需要fromJson在所有类中包括实现。

问题:如何移至fromJson超类(Serializer),并为fromJson方法提供单一的,类型相关的实现?

Kar*_*cki 5

您可以在基类中定义静态fromJson()方法:Serializer

public static class Serializer {
    public static <T> T fromJson(String json, Type type) {
        return new Gson().fromJson(json, type);
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其用作:

TestClass obj = TestClass.fromJson(json, TestClass.class);
Run Code Online (Sandbox Code Playgroud)

它对于冗余类型信息并不完美,并且不能很好地支持泛型。人们应该倾向于组合而不是继承,并且在这种情况下将序列化保留在类层次结构之外。这种方法与简单的方法相比没有优势:

TestClass obj = new Gson().fromJson(json, TestClass.class);
Run Code Online (Sandbox Code Playgroud)