在泛型类型上调用Enum.values()

时间:2017-07-25 17:46:26

标签: java enums generic-programming

目标是实现通用的Enum翻译器。 我知道 Enum1 Enum2 具有相同的值并且顺序相同。

目标是实现这样的事情:(这有效)

private static Enum1 translateEnum(Enum2 originalEnum) {
    return Enum1.values()[originalEnum.ordinal()];
}

但我有几个枚举,所以我想制作一个通用方法:(这不起作用)

private static < T extends Enum<T>,G extends Enum<G>> T translateEnum(G originalEnum) {
    return T.values()[originalEnum.ordinal()];        
}

我的问题是,在 T.values(),编译器告诉我:

  

对于类型T

,方法值()未定义

你们是否知道如何解决这个问题,或者你对我的问题有任何其他想法?

1 个答案:

答案 0 :(得分:3)

执行此操作的常用方法是将目标class object(或目标类的对象)作为参数传递给函数,然后使用类对象中的方法来执行棘手的部分。对于枚举类,类对象具有a method which returns the equivalent of 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);
        }
    }
}

运行它会产生以下输出:

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'