gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:59 25 4
gpt4 key购买 nike

我想编写一个通用方法,该方法采用扩展 Enum 的有界参数。例如,如果我有一个 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()。这是枚举的特性还是有解决办法?

最佳答案

values() 在Java中是一个很奇怪的东西。查看 Enum 的文档 - values() 甚至不存在! values() 根本不是 Enum 的方法。相反,一个名为 values()static 方法被隐式添加到每个扩展 Enum 的类中。但是一个 enumvalues() 方法不同于另一个 enum 中的 values() 方法。

T extends Enum 的事实意味着,如果 t 的类型为 T,您可以调用 instance 方法枚举 t。您不能调用 Enumstatic 方法(即使可以,values() 也不存在!)

values() 只有在您知道实际的 enum 名称时才有用。当你只有一个类型参数 T 时不能使用它。

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

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

关于java - 有界扩展枚举参数的通用方法 - 无法访问 values() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com