我已经实现了一个将类型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
和CClass
没有交叉引用(AClass
不知道BClass
所以我无法在{{1}中定义像BClass
...)的东西。
我需要一些东西:
convertToAClass
!!!
对此感到困惑。抱歉。
答案 0 :(得分: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;
}
}
如果要转换列表,则必须始终使用静态帮助器方法。
答案 1 :(得分: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)