Gab*_*yot 6 java enums generic-programming
目标是实现一个通用的 Enum 翻译器。我知道Enum1和Enum2具有相同的值和相同的顺序。
目标是实现这样的东西:(这有效)
private static Enum1 translateEnum(Enum2 originalEnum) {
return Enum1.values()[originalEnum.ordinal()];
}
Run Code Online (Sandbox Code Playgroud)
但是我有几个枚举,所以我想制作一个通用方法:(这不起作用)
private static < T extends Enum<T>,G extends Enum<G>> T translateEnum(G originalEnum) {
return T.values()[originalEnum.ordinal()];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是在T.values()编译器告诉我:
方法 values() 对于类型 T 是未定义的
你们知道我如何解决这个问题,或者你对我的问题有什么其他想法吗?
一种常见的方法是将目标类对象(或目标类的对象)作为参数传递给函数,然后使用类对象中的方法来完成棘手的部分。对于枚举类,类对象具有返回等效于 Enum.values() 的方法。您可以使用它从目标类中获取枚举值:
public class Scratch {
enum lower { a, b, c };
enum upper { A, B, C };
static <T extends Enum<T>> T translate(Enum<?> aFrom, Class<T> aTo) {
return aTo.getEnumConstants()[aFrom.ordinal()];
}
public static void main(String[] args) {
for (lower ll : lower.values()) {
upper uu = translate(ll, upper.class);
System.out.printf("Upper of '%s' is '%s'\n", ll, uu);
}
for (upper uu : upper.values()) {
lower ll = translate(uu, lower.class);
System.out.printf("Lower of '%s' is '%s'\n", uu, ll);
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行它会产生以下输出:
Upper of 'a' is 'A'
Upper of 'b' is 'B'
Upper of 'c' is 'C'
Lower of 'A' is 'a'
Lower of 'B' is 'b'
Lower of 'C' is 'c'
Run Code Online (Sandbox Code Playgroud)