Java Can';t构造泛型类型参数,该怎么做?
可能重复:Java Can';t构造泛型类型参数,该怎么做?,java,list,generics,type-erasure,Java,List,Generics,Type Erasure,可能重复: 在尝试编写以下内容后,我才发现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.ad
在尝试编写以下内容后,我才发现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;
}
公共静态列表JSONtoList(JSONArray数据){
列表=新的ArrayList();
对于(int i=0;i
这并没有编译,但我想这很明显是我想要做的。我该怎么做呢?如果您使用的是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;
}
公共静态列表jsonToList(JsonArray数据,类类型){
Gson Gson=新的Gson();
列表=新的ArrayList();
for(JsonElement e:数据)
add(gson.fromJson(e,type));
退货清单;
}
否则,您将需要使用反射或
Class
的newInstance
方法。如果您使用的是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;
}
公共静态列表jsonToList(JsonArray数据,类类型){
Gson Gson=新的Gson();
列表=新的ArrayList();
for(JsonElement e:数据)
add(gson.fromJson(e,type));
退货清单;
}
否则,您将需要使用反射或
Class
的newInstance
方法反射是一个选项;另一种方法是让您的方法接受第二个参数,一个泛化工厂。例如,番石榴定义了:
公共接口功能{
T应用(F输入);
}
公共静态列表JSONtoList(
JSONArray数据,
功能工厂)
{
列表=新的ArrayList();
对于(int i=0;i
(我记得,JSONArray.get(int)
返回Object
,对吗?如果不是,用该方法返回的任何内容替换工厂的F
)
这里的想法是调用站点将知道
C
实际上是什么,并且它将能够定义函数
的实现,给定JSON数组元素,该函数将返回一个新的C
实例。最有可能的是,您将把它作为一个私有静态final
匿名类使用。反射是一个选项;另一种方法是让您的方法接受第二个参数,一个泛化工厂。例如,番石榴定义了:
公共接口功能{
T应用(F输入);
}
公共静态列表JSONtoList(
JSONArray数据,
功能工厂)
{
列表=新的ArrayList();
对于(int i=0;i
(我记得,JSONArray.get(int)
返回Object
,对吗?如果不是,用该方法返回的任何内容替换工厂的F
)
这里的想法是调用站点将知道
C
实际上是什么,并且它将能够定义函数
的实现,给定JSON数组元素,该函数将返回一个新的C
实例。最有可能的情况是,您将把它作为一个私有静态final
匿名类使用。您可以包含错误消息吗?我不认为Java让你在泛型对象上做构造函数。@BrianNickel你是对的。这是一个例子,说明了如果Java支持这一点,我会如何做。泛型实现实际上是我在使用.Net()时错过的更大的东西。您可能会认为,由于bean是Java中的一个常见组件,它们会使操作变得简单。您可以包含错误消息吗?我不认为Java让你在泛型对象上做构造函数。@BrianNickel你是对的。这是一个例子,说明了如果Java支持这一点,我会如何做。泛型实现实际上是我在使用.Net()时错过的更大的东西。您可能会认为,由于bean是Java中如此常见的组件,它们会使它变得简单。