2016-01-14 60 views
1

我有2個包,A和B包含相同的類列表。我無法直接使用推土機或任何映射工具,因爲枚舉值在一個包中是大寫,在另一個包中是camelcase。我想寫一個泛型方法,它接受來自程序包A的枚舉並使用反射將其轉換爲程序包B中的枚舉。下面是我寫的特定代碼 -使用Java Reflection API轉換枚舉而不知道類型

return a.CardType.valueOf(((b.CardType)source).getValue().toUpperCase()); 

我想寫通用的代碼轉換假設我有源類(枚舉類型)爲研究對象,源類名稱和目的地類名

+0

對不起,我想寫通用的代碼轉換假設我有源類(枚舉類型)爲研究對象,源類名稱和目的地類名 –

回答

2

是你想要什麼

public class Mango { 
    static enum Upper {A,B,C} 
    static enum Lower {a,b,c} 


    static <SRC extends Enum<SRC>,DST extends Enum<DST>> DST convert(SRC a, Class<DST> classDst){ 
     return Enum.valueOf( classDst,a.name().toUpperCase()); 
    } 

    public static void main(String[] args) { 
     System.out.print(convert(Lower.a,Upper.class)); 
    } 

} 

編輯:

所以,你要小寫/大寫枚舉轉換爲駝峯?只需修改轉換功能:

static <SRC extends Enum<SRC>,DST extends Enum<DST>> DST convert(SRC a, Class<DST> classDst){ 
     for (DST dst : EnumSet.allOf(classDst)){ 
      if (dst.name().equalsIgnoreCase(a.name())){ 
       return dst; 
      } 
     } 
     throw new IllegalArgumentException("Value not found"); 
    } 
+0

如果目標不只是完全源代碼大寫,你也可以使用'classDst.getEnumConstants()'來進行掃描。 – OldCurmudgeon

+0

@OldCurmudgeon或者你可以使用'EnumSet.allOf(classDst)'來驗證,但如果它們不一樣,你可能無法逃避通用轉換器 – user902383

+0

非常感謝。抱歉,我發佈時沒有注意到一個挑戰。包A中的枚舉定義爲駝峯式。 –

相關問題