我如何正确使用泛型?

时间:2010-12-28 06:43:34

标签: java android json generics

我基本上正在制作网络请求并收到JSON响应。根据请求,我将JSON请求解析为我创建的对象。无论我解析成什么样的对象,解析几乎都是一样的。所以我有一堆方法只用不同的对象做同样的工作,我想知道如何用泛型来完成这个?这是一个例子

   public static ArrayList<Contact> parseStuff(String responseData) {
ArrayList<Person> People = new ArrayList<Person>();
try {

    JSONArray jsonPeople = new JSONArray(responseData);
    if (!jsonPeople.isNull(0)) {
        for (int i = 0; i < jsonPeople.length(); i++) {
            People.add(new Person(jsonPeople.getJSONObject(i)));
        }

    }

} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (Exception e) {

}

return People;

}

2 个答案:

答案 0 :(得分:3)

您应该查看Effective Java 2, Item 29: Consider typesafe heterogeneous type containers

基本思想是你可以想象你有一些Deserializer界面。然后你可以拥有Map<Class<?>, Deserializer<String, Object>>。该映射基本上是从类型到该类型的正确Deserializer的注册表(从String(可能你想要一个json类型或其他东西而不是String,但String工作)反序列化到感兴趣的类型。

真正的诀窍是必须强制类密钥类型与反序列化器类型匹配。 ie - 对于某些作为地图中键的类,您将反序列化器作为值。您可以使用通用方法执行此操作。例如:

<T> void put(Class<T> clazz, Deserializer<String, T> deserializer) {
  map.put(clazz, deserializer);
}

然后,要使用异构映射,您可以再次使用泛型方法:

<T> T deserialize(Class<T> typeToDeserializeFromJson, String toDeserialize) {
  return typeToDeserializeFromJson.cast(
      deserializers.get(tTDFJ).deserialize(toDeserialize));
}

您使用方法调用者指定的类型

     
  • 查找正确的“解串器”  
  • 将json文本反序列化为`Object`  
  • 安全地将`Object`转换为我们知道安全的正确类型,因为我们首先构建了地图。

我希望我所说的至少有点清楚。阅读EJ2中的相应条目应该有所帮助!

<强> 更新:

As Abhinav points out,GSON库将帮助您实现以适当使用泛型的方式反序列化对象的最终目标。但是,我认为你的问题更多是关于泛型而不是最终目标,所以我觉得我的答案更合适。 GSON必须使用异构类型容器实现: - )。

谢谢,Abhinav指出了GSON!

答案 1 :(得分:1)

我建议您使用GSON而不是JSON。它真的简化了你的生活。