无法构造泛型类型参数,而是做什么?

时间:2012-03-29 02:22:24

标签: java list generics type-erasure

  

可能重复:
  Create instance of generic type in Java?

我只发现Java在尝试写这个之后不允许你构造泛型类型参数的新实例:

public static <C extends JSONSerializable> List<C> JSONtoList(JSONArray data) {
    List<C> list = new ArrayList<C>();
    for (int i = 0; i < data.length(); i++){
        list.add(new C(data.get(i)));
    }
    return list;
}

这不能编译,但我认为它显然是我想要做的。我该怎么办?

2 个答案:

答案 0 :(得分:1)

如果您使用的是GSON,这实际上非常简单:

public static <C extends JSONSerializable> List<C> jsonToList(JsonArray data, Class<C> type) {
    Gson gson = new Gson();
    List<C> list = new ArrayList<C>();
    for (JsonElement e : data)
        list.add(gson.fromJson(e, type));
    return list;
}

否则,您需要使用反射或newInstance的{​​{1}}方法。

答案 1 :(得分:0)

反思是一种选择;另一种方法是让你的方法采取第二个论点,一个普遍的工厂。例如,guava定义了Function

public interface Function<F,T> {
    T apply(F input);
}

public static <C extends JSONSerializable> List<C> JSONtoList(
    JSONArray data,
    Function<Object,C> factory)
{
        List<C> list = new ArrayList<C>();
        for (int i = 0; i < data.length(); i++) {
            C instance = factory.apply(data.get(i)) // instead of new
            list.add(instance);
        }   
        return list;
}   

(我记得,JSONArray.get(int)会返回Object,对吗?如果没有,请将该工厂的F替换为该方法返回的内容。)

这里的想法是,调用站点将知道C实际上是什么,并且它将能够定义Function的实现,在给定JSON数组元素的情况下,它返回一个新的C个实例。最有可能的是,你将这个作为private static final匿名类。