2014-04-08 25 views
1

我試圖創建一個enum類的集合,以便我可以遍歷集合,然後通過調用enumClass.getEnumConstants()來遍歷枚舉值。集合或可變參數中的通用枚舉

考慮以下幾點:

public interface MyEnumType { 
    String getSubtype(); 
} 

public enum MyEnumTypeA implements MyEnumType { 
    A_1, 
    A_2; 
    public String getSubtype() { return "A"; } 
} 

public enum MyEnumTypeB implements MyEnumType { 
    B_1, 
    B_2; 
    public String getSubtype() { return "B"; } 
} 

我一直在使用可變參數的嘗試:

private <T extends Enum<T> & MyEnumType> void handleTypes (
    Class<? extends T>... enumTypes) 
{ 
    for(Class<? extends T> enumType : enumTypes) 
     for(T value : enumType.getEnumConstants()) 
     handleValue(value); 
} 

private void doStuff() { 
    // error here 
    handleTypes(MyEnumTypeA.class, MyEnumTypeB.class); 
} 

...但在可變參數使用外卡的仿製藥,每當我試圖調用產生一個編譯錯誤功能

我還試圖建立一個List

public class MyMainClass 
{ 
    private static Collection<Class<Enum<? extends MyEnumType>>> ALL_TYPES 
     = Lists.newArrayList(); 
    { 
     // error here 
     ALL_TYPES.add(MyEnumTypeA.class); 
     ALL_TYPES.add(MyEnumTypeB.class); 
    } 
} 

...但是當我嘗試將add添加到列表中時,這也無法編譯。

下工作,但需要投(沒有編譯錯誤或警告,如果我在Object.class通過):

private void runNoMatchTests (Class... enumTypes) { 
    for(Class enumType : enumTypes) { 
     for(MyEnumType value : ((Class<MyEnumType>)enumType).getEnumConstants()) { 
     handleValue(value); 
     } 
    } 
} 

這怎麼能不使用強制做什麼?它可以在沒有使用演員的情況下完成嗎?

+0

Java不提前知道時間的任何亞型'MyEnumType'實際上是一個枚舉。 –

+0

什麼是'handleValue'?你在哪裏得到編譯錯誤? –

+0

@SotiriosDelimanolis'handleValue'只是一些處理'MyEnumType'對象的隨機函數,它可以像System.out.println(value.getSubtype());'一樣簡單。 –

回答

1

我不完全知道爲什麼是這樣的話,但如果你如下圖所示改變<T extends Enum<T> & MyEnumType><T extends Enum<?> & MyEnumType>你的第一次嘗試可以編譯:

private <T extends Enum<?> & MyEnumType> void handleTypes(Class<? extends T>... enumTypes) { 
    ... 
} 
+0

確實,這確實有用!它給了我一個關於可變參數中泛型的無用警告,但是如果我嘗試傳入'Object.class',也會出現編譯錯誤。謝謝!如果有人可以解釋爲什麼,那也是值得讚賞的。 –