创建变量参数的列表<! - ? - >

时间:2014-03-27 11:19:13

标签: java list generics

我的问题是我正在尝试使用与我的函数参数具有相同类的参数来实例化一个列表:

public <A extends CommunicationObject> List<A> Myfunction(A myObject){

    List<A> firstList;
    //do something

}

当我调用该函数时:

List<person> persons = Myfunction(person myObject);

第一个列表将A作为CommunicationObject,这不是我想要的。

我也试过这样做:

public <A extends CommunicationObject> List<A> Myfunction(A myObject){

  List<myObject.getClass()> firstList;
    //do something
} 

但不允许这样做。我有机会解决这个问题吗?

更新:

“person”是“CumminicationObject”的子类。有一些属性存在于人而不是CommunicationObject中。实际上这只是一个例子。我要做的是将JSON转换为List“&lt;”A“&gt;”,A可以是“person”或其他扩展CommunicationObject的类。

JSON包含与List“&lt;”A“&gt;”中的“A”类相同的属性。

为了进行转换,列表“&lt;”A“&gt;”中的参数“A”必须与myfunction中的对象类相同(一个myObject)。

1 个答案:

答案 0 :(得分:3)

Java使用type-erasure,这意味着您的方法声明有点没有意义,因为编译器没有返回类型来推断A的类型。

这意味着在运行时你已经有效地获得了:

public void Myfunction(CommunicationObject myObject)

当你考虑它时,这个方法签名就是它的实现必须与之合作,所以你的列表应该是List<CommunicationObject>

更新了有关JSON反序列化的问题:

从JSON反序列化到Java对象时,您有两个选择:

  • 声明要在反序列化时反序列化的类型,如GSON
  • 推断要在JSON中反序列化的类型。

Due Java的type-erasure这是实现此目的的唯一方法。