无法构造泛型类型参数,该怎么做呢?
问题描述:
可能重复:
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;
}
这不会编译,但我认为它明显是我想要做的。我该怎么做?
答
如果您正在使用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;
}
否则,你将需要使用反射或Class
的newInstance
方法。
答
反射是一种选择;另一个就是让你的方法有第二个参数,一个有基础的工厂。比如,番石榴定义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
。
可以包含错误信息吗?我不认为Java让你在泛型对象上做构造函数。 – 2012-03-29 02:26:07
@BrianNickel你是对的。这是一个如果Java支持这个的例子。 – Drew 2012-03-29 02:34:39
泛型实现实际上是我使用.Net(http://msdn.microsoft.com/en-us/library/sd2w2ew5.aspx)时错过的更大的东西。你会认为bean是Java中如此常见的组件,它们会让它变得容易。 – 2012-03-29 03:43:45