【问题标题】:How should I implement this method?我应该如何实现这个方法?
【发布时间】:2011-10-23 16:34:11
【问题描述】:

假设我有一个超类 Entity 和一些子类 CreatureHeroes 等。我在 JSON 文件中有所有子类的数据,其中包含代表每个子类的数组,例如文件 json/creatures/a.json 代表所有 A 类型的生物。我正在使用 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&lt;? extends Entity[]&gt; 并改为返回类型 Entity[] 吗?如果是这样,那么我应该在哪里以及如何访问该数组的单个元素?还是我应该每个文件只有一个生物并将名称作为字符串发送?

【问题讨论】:

  • 请注意:在您的示例parseFromJson 中,参数c 已经Class 对象,因此您可能不想做@987654332 @,从那时起,您一定会得到Class.class
  • 现已编辑。我猜演员阵容也不需要?
  • 是的。检查the javadoc for gson.fromJson(),它返回类型T,所以不需要强制转换。

标签: java generics gson


【解决方案1】:

你可以试试

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

【讨论】:

  • 如果我这样做 Creature[] carr = Entity.parseFromJSON(new java.io.File("json/creatures/castle.json"), Creature[].class); 它会给我&lt;T&gt;parseFromJSON(java.io.File,java.lang.Class&lt;T&gt;) in heroes.model.Entity cannot be applied to (java.io.File,java.lang.Class&lt;heroes.model.Creature[]&gt;)
  • @pg-robban,对,如果&lt;T extends Object&gt; 可以工作,但也许这不是你要找的。​​span>
  • 是的,这确实有效,但是否可以强制执行某种方式,我只能将(子类)数组传递给实体?
  • @pg-robban,目前我只能考虑将Class&lt;T[]&gt; clazz 作为第二个参数。但这给了你两个例程,一个有[],一个没有。
猜你喜欢
  • 2011-03-20
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多