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中如此常见的组件,它们会使它变得简单。