具有有界扩展枚举参数的通用方法 – 无法访问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
每个类中。 但是一个enum
的values()
方法与另一个enum
的values()
方法不同。
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
),则可以在该对象上使用Class#getEnumConstants()
。
这是static
方法的特点 。 在Java中,无论使用generics还是其他方法,都无法定义适用于static
方法的接口,即。 一个类应该/必须实现一个static
方法。
此外,类型擦除(除其他外)阻止您在static
方法调用表达式中使用类型变量T
作为类型名称。