创建一个可以转换不同类列表的函数

时间:2011-10-31 15:41:56

标签: java oop generics inheritance

我有3节课, Z级,     calss A实现OInterface,而calss B实现OInterface     

我想创建一个将Z列表转换为OInterface

列表的函数
List<OInterface > myfunction(List<Z> mylist){
     List <OInterface > ret=new  List <OInterface >;
     for (Z z : mylist){
          OInterface tmp=new OInterface ()
          tmp.a=z.a
          tmp.b=z.b
          ret.add (tmp)
      }
     return ret;
}
我可以这样使用:

List<Z> zzz=...
List<A> aaa=myfunction(zzz);
List<B> aaa=myfunction(zzz);

当然这不会编译,它更像是伪代码来显示我想要做的事情。

有没有办法实现这个?

2 个答案:

答案 0 :(得分:1)

由于Z未实现OInterface,您将永远无法通过任何方法将<转换'Z转换为OInterface。这显然是设计的 - 你首先OInterface的原因是确保你总能保证继承对象的形状

您要么必须使Z实现OInterface,要么编写一个方法将Z转换为A和/或Z转换为B,然后创建A或B列表。

只有这样,您能否将其视为OInterface元素列表 - 您可以执行以下操作:

OInterface anObject = aaa[0];

答案 1 :(得分:0)

对于令人困惑的名称感到抱歉,请调用静态方法进程:

new Processor<Z,A> () {
  public A process(Z z){
    A a = new A();
    a.addSomethingFrom(z);
   return a ;
}
}

作为参数

public interface Processor<A,R> {
    R process(A a);
}

public static <Input, Output> List<Output> process(List<Input> as, Processor<Input, Output> processor) {
    List<Output> ret = new ArrayList<Output>();
    for (Input a: as) {
        ret.add(processor.process(a));
    }
    return ret;
}