通用方法参数:实现接口的枚举

时间:2016-12-22 13:45:21

标签: java generics enums

我有interface

public interface NamedEnum {
    String getName();
}

enum实现interface

public enum MyEnum implements NamedEnum {

    MYVALUE1("My value one"),
    MYVALUE2("My value two");

    private String name;

    private MyEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

一种不编译的方法:

public static Map<Integer,String> wrong(Enum<? extends NamedEnum> value) {
    Map<Integer,String> result = new LinkedHashMap<Integer, String>();
    for (Enum<? extends NamedEnum> val : value.values())
        result.put(val.ordinal(), val.getName());
    return result;
}

两个错误:

  

The method values() is undefined for the type Enum<capture#1-of ? extends NamedEnum>   The method getName() is undefined for the type Enum<capture#3-of ? extends NamedEnum>

我无法弄清楚上述方法如何接受实现enum的{​​{1}}。

2 个答案:

答案 0 :(得分:7)

使用交集类型定义类型变量:

public static <E extends Enum<E> & NamedEnum> Map<Integer,String> wrong(E value) {

但请注意,这是传递枚举的一个元素,而不是枚举类本身。您可能想要使用:

public static <E extends Enum<E> & NamedEnum> Map<Integer,String> wrong(Class<E> clazz) {

然后使用clazz.getEnumConstants()获取迭代的值:

for (E val : clazz.getEnumConstants())

或者,您可以使用value.getDeclaringClass().getEnumConstants()

答案 1 :(得分:3)

虽然我同意Andy建议的解决方案,但我认为您可能也希望以不同的方式看待问题。

IIUC,您正在寻找一种方法来获取getName()根据枚举的序数返回的值。换句话说,您正在寻找这样的映射:

  • 0 =&gt; &#34;我的价值观&#34;
  • 1 =&gt; &#34;我的价值2&#34;

如果情况确实如此,那么如何直接使用枚举值数组(数组由枚举序数值索引)。例如:

NamedEnum[] arr = MyEnum.values();
System.out.println(arr[0].getName());   // Output: "My value one"
System.out.println(arr[1].getName());   // Output: "My value two"

请注意,arr变量可以从不同的枚举中分配(只要它们实现NamedEnum接口)。例如,如果您在程序中定义了其他枚举:

public enum MyOtherEnum implements NamedEnum {

  MYVALUE3("My other value three"),
  MYVALUE4("My other value four");

  private String name;

  private MyOtherEnum(String name) {
      this.name = name;
  }

  @Override
  public String getName() {
      return name;
  }
}

然后以下是一个有效的main()方法:

public static void main(String[] args) {
  NamedEnum[] arr = MyEnum.values();
  System.out.println(arr[0].getName()); 
  System.out.println(arr[1].getName()); 

  arr = MyOtherEnum.values();
  System.out.println(arr[0].getName()); 
  System.out.println(arr[1].getName());
}

预期的输出是:

My value one
My value two
My other value three
My other value four

希望有所帮助。

相关问题