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

我想写一个generics方法,它采用扩展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 } 

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

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

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

values()在Java中是一件非常奇怪的事情。 查看Enum的文档 – values()甚至不存在! values()根本不是Enum的方法。 而是将一个名为values()static方法隐式添加到扩展Enum每个类中。 但是一个enumvalues()方法与另一个enumvalues()方法不同。

T extends Enum的事实意味着如果t具有类型T ,则可以在t上调用Enum 实例方法。 你不能调用Enum static方法(即使你可以, values()也不存在!)

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

解决这个问题的方法是传递一个Class对象。 喜欢这个:

 public static > T getFlags(Class clazz, int f){ T[] array = clazz.getEnumConstants(); // This is how you can get an array. Set set = EnumSet.allOf(clazz); // This is how you can get a Set. } 

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

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

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