2013-07-19 26 views
1

我已經實現了一個小框架,用於將A類型的泛型實體轉換爲B類型之一。Java通用類映射器多對一

所以我創建了一個接口:

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方法是免費的。

我想要了解的是如何推廣的米到一個類型轉換器,而不需要總是重新實現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; 
    } 
} 

考慮到AClassBClassCClass不擴展任何普通類(除了Object)。 而AClassBClassCClass沒有交叉引用(AClass是不知道的BClass,所以我不能在BClass東西定義爲convertToAClass ...)。

我需要的東西,如:

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

關心,並抱歉的混淆。

回答

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

@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) 
+0

感謝您的回答。問題是 公共接口IConverter_Multi { 公共IConvert_Bi of_Bi(T1實體); 公共IConvert_Bi of_Bi(T2實體); (T3實體)的公共IConvert_Bi ; } 生成一個「名稱衝突具有相同的擦除」錯誤 –

+0

現在我已經更新我的答案。你是對的,我忽略了擦除錯誤。我注意到,我們可以做出IConverter_Multi類(名爲Multi_Converter現在),而不是與任何損失來解決這個問題的接口。 – Susanta