具有有界扩展枚举参数的通用方法 - 无法访问values()方法

时间:2015-01-11 22:14:12

标签: java generics enums

我想写一个泛型方法,它采用扩展Enum的有界参数。例如,如果我有一个枚举如下:

public enum InputFlags{
    ONE (0000001),
    TWO (0000002),
    THREE (00000004);

    public final int value;

    InputFlags(int value){
        this.value = value;
    }
}

然后我可以执行以下操作:

for (InputFlags ifg : InputFlags.values()){
            // Do something with ifg
}

但是,如果我尝试在返回参数有限的泛型方法中执行上述操作,则无法访问values()方法:

public static <T extends Enum> T getFlags(int f){
        T.values(); // NOT allowed, even though I have bounded by extending Enum.
}

好像我无法在泛型方法中访问values()。这是Enums的特点还是有办法解决这个问题?

3 个答案:

答案 0 :(得分:8)

values()在Java中是一件非常奇怪的事情。查看Enum的文档 - values()甚至不存在! values()根本不是Enum的方法。相反,名为static的{​​{1}}方法会隐式添加到扩展values()的每个类中。但是,一个Enum的{​​{1}}方法与另一个values()中的enum方法不同。

事实values()表示如果enum的类型为T extends Enum,您可以在t T上调用实例方法。你无法调用Enum的{​​{1}}方法(即使你可以,t也不存在!)

static仅在您知道名称的实际Enum时才有用。只有类型参数values()时才能使用它。

解决此问题的方法是传递values()对象。像这样:

enum

答案 1 :(得分:1)

values()是编译器在InputFlags类中插入的静态方法。因此,不可能使用T.values(),尤其是因为T是泛型类型。但是,如果您可以获取T的Class对象(通常是通过getClass(),或者将其传递给getFlags(int f, Class<T> clazz)),则可以在该对象上使用Class#getEnumConstants()

答案 2 :(得分:0)

这是static方法的特性。在Java中,无论使用泛型还是其他方法,都无法定义适用于static方法的接口,即。一个类应该/必须实现static方法。

此外,类型擦除(除其他外)阻止您在T方法调用表达式中使用类型变量static作为类型名称。