如何将命名的以下方法reverse重写为允许任何枚举类型的通用方法.
public class TestX {
enum Gender { male, female }
public static void main(String[] args) {
System.out.printf("%s\n", TestX.reverse("male").name());
System.out.printf("%s\n", TestX.reverse("female").name());
}
static Gender reverse(String name) {
for (Gender g: Gender.class.getEnumConstants())
if (g.name().equals(name))
return g;
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了什么(但不编译T.class):
<T extends Enum<?>> T reverse2(String name) {
for (T t: T.class.getEnumConstants())
if (t.name().equals(name)) return t;
return null;
}
Run Code Online (Sandbox Code Playgroud)
怎么样
// Every enum class extends Enum<ThisEnumClassName>.
// Since we want T to be enum we must write it as "extends Enum"
// but Enum is also generic and require type of store parameters
// so we need to describe it as Enum<T> which finally gives us - T extends Enum<T>
static <T extends Enum<T>> T reverse(String name, Class<T> clazz) {
for (T t : clazz.getEnumConstants())
if (t.name().equals(name))
return t;
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果你想使它成为通用的,你需要指定你想从哪个Enum获取你的值.否则,有没有办法找到正确的enym(除非你也把它在的地方name像full.package.name.of.YourEnum.VALUE).
你也可以考虑使用
Enum.valueOf(YourEnumClass.clazz, "ENUM_FIELD_NAME")
Run Code Online (Sandbox Code Playgroud)
但是null当enum没有指定的元素将抛出时,这种方法而不是返回java.lang.IllegalArgumentException.
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |