2014-02-17 129 views
2

我有兩種類型的枚舉:傳遞枚舉類型作爲參數在Java中

public static enum Type1 { 
    T1_A, 
    T1_B 
} 

public static enum Type2 { 
    T2_A, 
    T3_B 
} 

我希望能寫,可以採取任何這些枚舉的API(Type1Type2)作爲參數,並與他們做一些事情。我如何設計一種讓我在運行時選擇枚舉類型的方法?

某事的效果:

void fun(?? type1_or_type2) { 
     // something goes here... 
    } 
+1

爲什麼downvote?問題很明顯。至少發表評論。 –

+0

你認爲如何編寫一個採用兩種不同類型的方法?下面的答案毫無疑問會「起作用」,因爲一個通用的接口將允許通過實現它的任何事情,但真正的問題是「爲什麼你想這麼做?」 –

+1

@BrianRoach這是什麼問題:)而且我們也有可能的解決方案。 –

回答

7

您可以創建一個有沒有方法標記接口,讓枚舉實現該接口。接下來,將該接口用作方法的參數類型。

3

定義一個接口,並在你的枚舉類中實現該接口。然後使用接口類型作爲參數

interface Type { 
    ... 
} 

public static enum Type1 implements Type { 
    T1_A, 
    T1_B 
} 

public static enum Type2 implements Type { 
    T2_A, 
    T2_B 
} 

void fun(Type aType) { 
     // something goes here... 
    } 
1

試試這個:

interface Marker { 

    } 

    enum Type1 implements Marker { 
     T1_A, T1_B 
    } 

    enum Type2 implements Marker { 
     T2_A, T3_B 
    } 


    void fun(Marker e) { 
    // something goes here... 
    if (e instanceof Type1) { 
     // Do Type1 specific 
    } else if (e instanceof Type2) { 
     // Do Type2 specific 
    } 

    } 
+0

+1例如 –

+0

的例子我絕對想避免instanceof,特別是如果有大量的枚舉來玩。 –

3

或者,這可能是一個態度來看待:

public interface SomeInterface { 
    public void interface(Type1 type); 
    public void interface(Type2 type); 
} 
+0

從長遠來看可能更安全,避免有人實施其他答案中建議的界面。 –

+2

我喜歡這不僅僅是一個標記界面 – Kitesurfer

0

你可以通過枚舉類作爲參數。

void fun(Class<? extends Enum<?>> yourEnum) { 
    // Do something here. Here's how you would get an array of the Enum values. 
    yourEnum.getEnumConstants(); 
} 

你會通過的Type1英寸

fun(Type1.class);