使用泛型调用方法

时间:2012-02-16 15:20:47

标签: java generics

我正在使用一个返回JSON的服务,该服务可以转换为Map(我使用google-gson lib进行转换)。我需要从这个Map获取一组值。 首先,我有下一个结构:

public Set<ProfileShow> getShows() {
    String json = ...; //getting JSON from service
    if (!Utils.isEmptyString(json)) {
        Map<String, ProfileShow> map = Utils.fromJSON(json, new TypeToken<Map<String, ProfileShow>>() {
        }.getType());

        Set<ProfileShow> result = new HashSet<ProfileShow>();
        for (String key : map.keySet()) {
        result.add(map.get(key));
        }
        return result;
    }
    return Collections.emptySet();
}

public Set<Episode> getUnwatchedEpisodes() {
    String json = ...; //getting JSON from service
    if (!Utils.isEmptyString(json)) {
        Map<String, Episode> map = Utils.fromJSON(json, new TypeToken<Map<String, Episode>>() {
        }.getType());

        Set<Episode> result = new HashSet<Episode>();
        for (String key : map.keySet()) {
        result.add(map.get(key));
        }
        return result;
    }
    return Collections.emptySet();
}

Utils.fromJSON方法:

public static <T> T fromJSON(String json, Type type) {
    return new Gson().fromJson(json, type);
}

如您所见,方法getShows()和getUnwatchedEpisodes()具有相同的结构。唯一的区别是返回集的参数化类型。所以,我决定将Set从JSON转移到util方法:

public static <T> Set<T> setFromJSON(String json, T type) {
    if (!isEmptyString(json)) {
        Map<String, T> map = fromJSON(json, new TypeToken<Map<String, T>>() {
        }.getType());

        Set<T> result = new HashSet<T>();
        for (String key : map.keySet()) {
        result.add(map.get(key));
        }
        return result;
    }
    return Collections.emptySet();
}

但现在我仍然坚持如何以正确的方式调用此方法。像

这样的东西
Utils.setFromJSON(json, Episode.class.getGenericSuperclass()); //doesn't work

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

最简单的做法是将type的类型更改为Type,然后传入new TypeToken<Map<String, ProfileShow>>() { }.getType()或类似内容。

我想如果你真的想要的话,你可以构建ParameterizedType