我只发现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;
}
这不能编译,但我认为它显然是我想要做的。我该怎么办?
答案 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
匿名类。