2013-08-03 144 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

谢谢。我知道。但在我的原地,我无法改变它。 –