2013-08-03 181 views
0

我有兩個相似的對象(實際上是實體)。從一個函數中,我得到其中一個。所以我知道我只在運行期間得到哪一個。動態返回類型 - Java泛型

我需要對我得到的對象進行處理。兩者都具有相同的一組要應用的過程。所以我想寫這兩個類的通用函數。我試圖寫,但我沒有清楚如何實現這一點。

List<MyClassA> objAList; 
List<MyClassB> objBList: 
List<ResultA> resultObjAList; 
List<ResultB> resultObjBList; 

objAList = getResult(); 
objBList = getResult() 

if (objAList != null) { 
    // Set of function calls on ObjA to process further. For ex: 
    resultObjAList = doProcess(objAList); 

} else { 
    // Same set of function class to process. For Ex: 
    resultObjBList = doProcess(objBList); 
} 

我即將決定寫這類似於爲每個類做處理兩種不同的功能,嘗試幾次後。

注意上面的doProcess函數。它需要objAobjB並返回resultObjAresultObjB

我無法用接口包裝這兩個。所以選項被排除了。

doProcess看起來是這樣的:

List<ResultA> doProcess(List<MyClassA> A) { 
    for (MyClassList a : A) { 
      a.getSomething(); 
      doanotherProcess(a.getxya(), a.getABC()); 
      .... 
    } 
    return AnotherListOfType_ResultA; 
    } 

是否可以編寫通用的功能呢?

+0

「MyClassA」和「MyClassB」之間是否存在繼承關係?爲什麼你的'doProcess'方法有'List '作爲參數?什麼是「MyClassList」? –

+1

看看[類似問題](http://stackoverflow.com/questions/450807/java-generics-how-do-i-make-the-method-return-type-generic) – LRA

+0

@RohitJain。這些是兩個不同的實體,但具有相似的一組字段進行處理。但不完全相同。 'MyClassList'。它是一個錯字。現在更新。 –

回答

1

如果你想一般稱爲List<MyClassA>輸入ResultAList<MyClassB>輸入映射到ResultB,然後我可以回答,這是不可能的:沒有辦法表達對Java的泛型輸入類型那種結果類型的依賴。

理論上,您可以使用ResultA參數化MyClassA,如MyClassA<ResultA>,但它可能會讓您的代碼變得混亂。

+0

那麼它最好去兩種不同的方法路線? –

+0

我在想的原因是,如果我編寫兩個函數,它只會有重複的代碼。 –

+0

將通用代碼提取到第三種方法中,以便您可以從兩種類型特定的方法中重用它。 –

1

即使你想寫兩個功能,如
public void doProcess(List<ObjectA> list);public void doProcess(List<ObjectB> list);這是不可能的,因爲泛型是編譯時只建,因此,這兩個函數具有同一消失。

你可以做的最好的是有一個功能,並根據一些條件鑄造你的對象。

+0

那就是對的。我知道。它不能做到。但基本上,這個想法是寫兩個不同名稱的函數。 –

+0

我希望你可以使用一個規則「贊成實現接口」,爲ObjectA和ObjectB提供一個通用接口,並且可以在運行時根據類型輕鬆調用。 – BVMR

+0

謝謝。我知道。但在我的原地,我無法改變它。 –