2012-03-29 113 views
1

可能重复:
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; 
} 

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

+0

可以包含错误信息吗?我不认为Java让你在泛型对象上做构造函数。 – 2012-03-29 02:26:07

+0

@BrianNickel你是对的。这是一个如果Java支持这个的例子。 – Drew 2012-03-29 02:34:39

+0

泛型实现实际上是我使用.Net(http://msdn.microsoft.com/en-us/library/sd2w2ew5.aspx)时错过的更大的东西。你会认为bean是Java中如此常见的组件,它们会让它变得容易。 – 2012-03-29 03:43:45

回答

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; 
} 

否则,你将需要使用反射或ClassnewInstance方法。

0

反射是一种选择;另一个就是让你的方法有第二个参数,一个有基础的工厂。比如,番石榴定义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