【问题标题】:creating one function that can convert list of different classes创建一个可以转换不同类列表的函数
【发布时间】:2011-10-31 15:41:55
【问题描述】:

我有 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);

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

有没有办法实现这个?

【问题讨论】:

  • 复杂性在于如何将Z 转换为A。为list of Z to Alist of Z to B 编写一个转换方法要比编写一个两者都做的通用方法要简单得多。
  • 如果OInterface 是一个接口,它将不支持字段,因此tmp.a = ... 是不可能的。
  • 在您的示例中,您说 B 类实现 OInterface 和 Z 类,但在伪代码中您希望 myFunction 将 Z 转换为 OInterface。除非 Z 也实现了 OInterface,否则 A Z 并不总是可转换为 OInterface。你的意思是 List myfunction(List mylist)?
  • 您需要提供更多信息。您表明您想使用相同的方法myfunction(List&lt;Z&gt; my list) 来返回List&lt;A&gt;List&lt;B&gt;,这在Java 中根本不可能:您不能基于返回类型重载。您提供的签名List&lt;OInterface&gt; myfunction(List&lt;Z&gt; mylist) 将始终采用Z 对象的List(正如您所说,不实现OInterface),并返回其他一些的列表实现OInterface 的对象(AB,实现OInterface 的其他一些类,或所有三者的混合)。这就是你想要的吗?

标签: java oop generics inheritance


【解决方案1】:

由于 Z 没有实现 OInterface,因此您将永远无法通过任何方法将 Z 'convert' 转换为 OInterface。这显然是设计使然 - 首先您拥有 OInterface 的真正原因是确保您始终可以保证继承对象的 形状

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

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

OInterface anObject = aaa[0];

【讨论】:

    【解决方案2】:

    不好意思名字混淆了,调用静态方法流程:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 2020-06-23
      相关资源
      最近更新 更多