2010-12-01 48 views
23

Correspondig以下問題通用枚舉:的Java:在方法的參數

Java: Enum parameter in method

我想知道,我怎麼可以格式化代碼需要枚舉一般。

Foo.java

public enum Foo { 
    a(1), b(2); 
} 

Bar.java

public class Bar { 
    public Bar(generic enum); 
} 

後來我將有更多的枚舉類,如「富」,但你仍然可以創建一個包含任何類型的枚舉類的吧。我有「jdk1.6.0_20」的方式...

回答

32

見方法EnumSet參考,例如

public static <E extends Enum<E>> EnumSet<E> of(E e) 

(此方法返回與給定的枚舉元素e一個元素的EnumSet)

所以一般的界限,你需要的是:<E extends Enum<E>>


其實,你也許會Bar本身通用:

public class Bar<E extends Enum<E>> { 

    private final E item; 

    public E getItem(){ 
     return item; 
    } 

    public Bar(final E item){ 
     this.item = item; 
    } 
} 

您也可以添加一個工廠方法像fromwith

public static <E2 extends Enum<E2>> Bar<E2> with(E2 item){ 
    return new Bar<E2>(item); 
} 

這樣一來,在客戶端的代碼,你只需要編寫一般的簽名一次:

// e.g. this simple version 
Bar<MyEnum> bar = Bar.with(MyEnum.SOME_INSTANCE); 
// instead of the more verbose version: 
Bar<MyEnum> bar = new Bar<MyEnum>(MyEnum.SOME_INSTANCE); 

參考:

+0

謝謝你的例子,因爲荒謬的語法是 - 我正在讀爲「佔位符擴展佔位符枚舉」(與剛的「佔位符擴展超「對於非枚舉) – Roboprog 2017-10-18 22:58:46

6
public class bar { 
    public <E extends Enum<E>> void bar(E enumObject); 
} 

bar方法現在可以接受任何類型的枚舉。

13

你也可以這樣來做:

public class Bar { 
    public Bar(Enum<?> e){} 
} 

每個枚舉擴展Enum。然後,如果你需要的枚舉常量您可以使用此:

e.getDeclaringClass().getEnumConstants()