2014-03-27 57 views
0

我的問題是,我試圖實例與具有相同課程作爲我的函數的參數的參數列表:創建一個變量參數列表<?>

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 
} 

,但它是不允許的。有沒有可能解決這個問題?

更新:

「人」 是 「CumminicationObject」 的子類。有一些屬性存在於個人而不是CommunicationObject中。其實這只是一個例子。我想要做的是將JSON轉換爲列表「<」A「>」,並且A可以是「person」或擴展CommunicationObject的其他類。

JSON包含與列表「<」A「>」中的「A」類相同的屬性。

爲了進行轉換,列表「<」A「>」中的參數「A」必須與myfunction(A myObject)中的我的對象類相同。

+0

我真的不明白你的問題。 'person'是'CommunicationObject'的子類型嗎?如果否:爲什麼你將它傳遞給'MyFunction'?如果是:是不是與你想要的相同的實際行爲? –

+0

看看更新 – deltascience

回答

3

Java使用type-erasure,這意味着您的方法聲明有點毫無意義,因爲編譯器沒有返回類型來從中推斷出A的類型。

這意味着,在運行時你有效地得到:

public void Myfunction(CommunicationObject myObject) 

這種方法的簽名,當你想想看,就是它的實施將有反正等你的名單應該是一個List<CommunicationObject>工作。

更新之後的問題就從JSON反序列化:

當反序列化JSON從一個Java對象,你有兩個選擇:

  • 聲明的類型脫在反序列化的位置進行序列化,就像GSON一樣。
  • 推斷要在JSON中反序列化的類型。

由於Java的type-erasure這是唯一的方法來做到這一點。

+0

我不明白這個答案。由於相同類型的擦除,'firstList'在運行時與'List '相同。但是泛型在編譯時安全。當然,你不能使用'CommunicationObject'沒有定義的'A'的任何屬性,因爲編譯器不能知道它們,但這並不意味着'A'是無關緊要的。例如,你不能'firstList.Add(new CommunicationObject())'。 –

+0

這個清單在很大程度上與老實說不相干。重點是,包括泛型是毫無意義的,因爲如果您編寫'MyFunction(「break」)'方法是用泛型聲明的(如問題中)還是沒有泛型聲明(如答案中),編譯器就會抱怨。因此,使用泛型不會使 –

+0

看到更新。 – deltascience

相關問題