1

我已经实现了一个小框架,可以将类型的通用实体转换为类型A之一B

所以我创建了一个界面:

public interface IConvert<A,B> {
    public B convert (A entity);
    public List<B> convertList(List<A> entitylist);
}

和一个抽象类来概括该convertList方法:

public abstract class AbstractConverter<A,B> implements IConvert<A, B> {

    @Override
    public abstract B convert(A entity) ;

    @Override
    public List<B> convertList(List<A> entitylist) {
        List<B> bs=new ArrayList<B>();
        for (A a : entitylist) {
            bs.add(convert(a));
        }
        return bs;
    }    
}

假设我们必须将一个BClass实例映射到一个AClass实例:

public class AClassConverter extends AbstractConverter<BClass, AClass>{

    @Override
    public AClass convert(BClass entity) {
        return new AClass(); //BClass to AClass mapping
    }
}

我可以简单地定义一个新类AClassConverter,扩展抽象类并实现特定的转换方法。该convertList方法是免费的。

我想了解的是如何将 m 概括为一种类型的转换器,而不必总是重新实现convertList实体的方法:

public class AClassConverter extends AbstractConverter<BClass, AClass> {

    @Override
    public AClass convert(BClass entity) {
    return new AClass(); //BClass to AClass mapping
    }

    public AClass convert(CClass entity) {
        return new AClass(); //CClass to AClass mapping
    }

    public List<AClass> convert(List<CClass> entityList) {
        //foreach > call convert(c);
        //return aClassList;
    }
}

考虑AClass, BClass,并且CClass不要扩展任何公共类(除了Object)。并且AClass, BClass, andCClass没有交叉引用(AClass不知道,BClass所以我不能在BClass某些东西中定义为convertToAClass...)。

我需要一些东西:

public class AClassConverter extends AbstractConverter<BClass, AClass> , AbstractConverter<CClass, AClass>

!!!

问候,并为混乱感到抱歉。

4

2 回答 2

2

由于 java 中缺乏多重继承,它不能那么容易地完成。

但是,以稍微不那么优雅的解决方案为代价,您可以重构代码,将convertList方法拉入静态帮助器类。

也许像这样:

public final class ConverterHelper {
   private ConverterHelper() {}

   public static <A,B> List<B> convertList(IConvert<A,B> converter, List<A> list)
   {
      List<B> bs=new ArrayList<B>();
      for (A a : list) {
         bs.add(converter.convert(a));
      }
      return bs;
   }
}

如果您想转换列表,您将始终必须使用静态辅助方法。

于 2013-07-19T17:33:23.543 回答
1

@cyon 是正确的,您需要将 convertList 拉出到辅助类。

这是我认为您所追求的解决方案。

public interface IConverter_Bi<T, T1> {
    public T convert (T1 entity);
}

public class Multi_Converter { // here m = 3
    public IConvert_Bi<T, T1> of_Bi (T1 entity){// impl}; // you can annoymously implement
    public IConvert_Bi<T, T2> of_Bi (T2 entity){// impl}; 
    public IConvert_Bi<T, T3> of_Bi (T3 entity){// impl};   
}

public class Util{

    public List<T> convertList(List<T1> entitylist, IConvert_Bi<T,T1> converter);
}

// here is some client code

// get the master converter
Multi_Converter master = ... impl    

// transform t2List (List<T2>) to List<T>

// get a bi-converter for T2. here is one of the possible ways
T2 aT2 = t2List.get(0);
t2Converter = master.of_Bi(t2List.get(0));

Uti.convertList(t2List, t2Converter)
于 2013-07-19T23:06:49.340 回答