Java:方法参数中的泛型枚举

Ed *_*hel 27 java generics parameters enums

对应以下问题:

Java:方法中的枚举参数

我想知道,如何格式化代码以通常需要枚举.

Foo.java

public enum Foo { 
    a(1), b(2);
}
Run Code Online (Sandbox Code Playgroud)

Bar.java

public class Bar {
    public Bar(generic enum);
}
Run Code Online (Sandbox Code Playgroud)

稍后我将有更多的枚举类,如"foo",但你仍然可以创建包含任何类型的枚举类的栏.顺便说一下,我有"jdk1.6.0_20"......

Sea*_*oyd 38

请参阅EnumSet中的方法以供参考,例如

public static <E extends Enum<E>> EnumSet<E> of(E e)
Run Code Online (Sandbox Code Playgroud)

(此方法返回一个EnumSet,其中包含给定Enum元素中的一个元素e)

所以你需要的通用边界是: <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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以添加像from,with等工厂方法.

public static <E2 extends Enum<E2>> Bar<E2> with(E2 item){
    return new Bar<E2>(item);
}
Run Code Online (Sandbox Code Playgroud)

这样,在客户端代码中,您只需编写一次通用签名:

// 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);
Run Code Online (Sandbox Code Playgroud)

参考:


And*_*dré 14

你也可以这样做:

public class Bar {
    public Bar(Enum<?> e){}
}
Run Code Online (Sandbox Code Playgroud)

每个枚举都扩展了Enum.然后,如果需要枚举常量,可以使用它:

e.getDeclaringClass().getEnumConstants()
Run Code Online (Sandbox Code Playgroud)


gus*_*afc 8

public class bar {
    public <E extends Enum<E>> void bar(E enumObject);
}
Run Code Online (Sandbox Code Playgroud)

bar方法现在可以接收任何类型的枚举.