我有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}}。
答案 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()根据枚举的序数返回的值。换句话说,您正在寻找这样的映射:
如果情况确实如此,那么如何直接使用枚举值数组(数组由枚举序数值索引)。例如:
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
希望有所帮助。