我该如何实现这种方法?

时间:2011-10-23 16:34:11

标签: java generics gson

假设我有一个超类Entity和一些子类CreatureHeroes等。我有JSON文件中子类的所有数据,其中包含代表每个子类的数组,例如文件json/creatures/a.json代表所有类型为A的Creatures。我正在使用gson解析文件。以下是示例文件的外观:

[
    {
        "name":         "Pikeman",
        "attack":       4,
        "defence":      5,
        // ...
    },
    {
        "name":         "Halberdier",
        "attack":       6,
        "defence":      5,
    }
]

现在我想我可以在Entity中创建一个解析给定JSON文件的方法,并使用它解析的数据返回一个Entity子类的实例。如果文件只包含一个实体,我可以执行类似

的操作
public static Entity parseFromJson(File file, Class<? extends Entity> c) {
    return gson.fromJson(new FileReader(file), c);
}

但现在它变得复杂了:文件包含子类的数组。我应该通过Class<? extends Entity[]>并返回类型Entity []吗?如果是这样,那么我应该在哪里以及如何访问该数组的单个元素?或者我应该只为每个文件只有一个生物并将名称作为字符串发送?

1 个答案:

答案 0 :(得分:2)

你可以尝试

public static <T extends Entity> T parseFromJSON(File file, Class<T> clazz) {
    return clazz.cast(gson.FromJson(new FileReader(file), clazz));
}

public static <T extends Entity> T[] parseFromJSONArray(File file, Class<T[]> clazz) {
    return clazz.cast(gson.FromJson(new FileReader(file), clazz));
}

你可以使用类似的东西(假设gson接受它)

Foo foo = parseFromJSON(file, Foo.class);
Foo[] foos = parseFromJSONArray(file, Foo[].class);