在泛型类型上调用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'
相关问题