【问题标题】:Java: generic enum in method parameterJava:方法参数中的通用枚举
【发布时间】:2010-12-01 14:24:00
【问题描述】:

对应以下问题:

Java: Enum parameter in method

我想知道,如何将代码格式化为一般需要枚举。

Foo.java

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

Bar.java

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

稍后我会有更多的枚举类,比如“foo”,但是你仍然可以创建包含任何类型的枚举类的 bar。顺便说一句,我有“jdk1.6.0_20”...

【问题讨论】:

    标签: java generics parameters enums


    【解决方案1】:

    参考EnumSet中的方法,例如

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

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

    所以你需要的通用范围是:&lt;E extends Enum&lt;E&gt;&gt;


    实际上,您可能会将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);
    

    参考:

    【讨论】:

    • 谢谢你的例子,就像语法一样荒谬 - 我读作“PLACEHOLDER extends Enum of PLACEHOLDER”(而不是“PLACEHOLDER extends SuperType”用于非枚举)
    【解决方案2】:

    你也可以这样做:

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

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

    e.getDeclaringClass().getEnumConstants()
    

    【讨论】:

      【解决方案3】:
      public class bar {
          public <E extends Enum<E>> void bar(E enumObject);
      }
      

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

      【讨论】:

        猜你喜欢
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多