Как мне реализовать этот метод? - PullRequest
1 голос
/ 23 октября 2011

Предположим, у меня есть суперкласс Entity и некоторые подклассы Creature, Heroes и т. Д. У меня есть все данные для подклассов в файлах JSON, которые содержат массивы, которые представляют каждый подкласс, например, файл json/creatures/a.json представляетвсе существа типа А. Я анализирую файлы с помощью 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 Ответ

2 голосов
/ 23 октября 2011

Вы можете попробовать

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);
...