英文:
How to return a generic Enum from a method that accepts a generic Enum?
问题
我正在尝试编写一个实用方法,该方法将接受任何类型的枚举并返回相同类型的枚举,但具有不同的值。
假设我有以下两个枚举:
enum Pet {
DOG("Puppy"),
CAT("Jazmine"),
LIZARD("Spock");
private final String value;
Pet(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
enum Topping {
PEPPERONI("Meat Saucers"),
ONION("Like Ogres"),
ANCHOVIES("Spicy Fish");
private final String value;
Topping(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
在我的应用程序中,用户需要能够“编辑”枚举值。例如,当用户想要编辑他们的“Pet”时,他们会看到枚举值的列表,可以从该列表中选择一个新值。
我试图做的是编写一个方法,可以处理任意数量的不同类型的枚举(例如:既有“Pet”又有“Topping”)。
由于我对泛型不太熟悉,以下是一个非常简陋的示例,说明我试图做什么:
public static GenericEnumType changeValue(Enum<?> e) {
// 向用户呈现e.values()列表,用户可以选择新值
String newValue = getUserInput();
return GenericEnumType.valueOf(newValue);
}
是否有办法实现这样的功能?
从我的研究中,我发现从通用枚举中检索值可能很困难,因为values()
方法实际上在编译时不可用。
英文:
I am trying to write a utility method that will accept an enum
of any type and return an enum
of the same type, but with a different value.
Suppose I have the following two enum
:
enum Pet {
DOG("Puppy"),
CAT("Jazmine"),
LIZARD("Spock");
private final String value;
Pet(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
enum Topping {
PEPPERONI("Meat Saucers"),
ONION("Like Ogres"),
ANCHOVIES("Spicy Fish");
private final String value;
Topping(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
In my application, a user needs the ability to "edit" an enum
value. For example, when the user wants to edit their Pet
, they are presented with a list of the enum
values and can select a new one from that list.
What I'm trying to do is write one method that can handle any number of different types of enum
(ie: both Pet
and Topping
).
Since I am not very familiar with generics yet, here is a very poorly "coded" example of what I'm trying to do:
public static GenericEnumType changeValue(Enum<?> e) {
// Present user with list of e.values(), user can select new value
String newValue = getUserInput();
return GenericEnumType.valueOf(newValue);
}
Is there a way to accomplish such a thing?
From my research, I've found that it may be difficult to retrieve values from generic enum
because the values()
method is not actually available at compile time.
答案1
得分: 1
Enum.valueOf
可能会抛出 IllegalArgumentException 和 NullPointerException 异常。你应该处理它。
英文:
public static Enum<?> changeValue(Enum<?> e) {
String newValue = getUserInput();
return Enum.valueOf(e.getClass(), newValue);
}
Enum.valueOf
could throws IllegalArgumentException and NullPointerException. You should handle it
答案2
得分: 0
你可以尝试这样做:
enum MyEnum1 { VALUE1, VALUE2 }
enum MyEnum2 { VALUE3, VALUE4 }
public static <E extends Enum<E>> E valueOf(
Class<E> enumClass, String value) {
return Enum.valueOf(enumClass, value);
}
然后
System.out.println(valueOf(MyEnum1.class, "VALUE1"));
当你需要一个接受任何类型的枚举的方法时,通常可以这样做。在这种特定情况下,由于你只是解析,可以简单地使用:
Enum.valueOf(MyEnum1.class, "VALUE1")
英文:
You can try this:
enum MyEnum1 { VALUE1, VALUE2 }
enum MyEnum2 { VALUE3, VALUE4 }
public static <E extends Enum<E>> E valueOf(
Class<E> enumClass, String value) {
return Enum.valueOf(enumClass, value);
}
Then
System.out.println(valueOf(MyEnum1.class, "VALUE1"));
This is generally what you can do when you need a method that accepts any types of enum. In this particular case, since you are parsing only, might as well simply use:
Enum.valueOf(MyEnum1.class, "VALUE1")
答案3
得分: 0
我认为你正在尝试从给定的枚举中查找枚举值,如果是这样,你可以使用反射来查找它们。以下是我所做的事情。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
System.out.println(changeValue(Pet.DOG));
}
public static Enum changeValue(Enum<?> e) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
// 提供用户选择 e.values() 列表中的新值
Method method = e.getClass().getDeclaredMethod("values");
Object obj = method.invoke(null);
System.out.println(Arrays.toString((Object[]) obj));
String newValue = getUserInput();
return e.valueOf(e.getClass(), newValue);
}
private static String getUserInput() throws IOException {
System.out.println("从列表中选择一个枚举并输入名称:");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String name = reader.readLine();
return name;
}
}
enum Pet {
DOG("Puppy"),
CAT("Jazmine"),
LIZARD("Spock");
private final String value;
Pet(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
enum Topping {
PEPPERONI("Meat Saucers"),
ONION("Like Ogres"),
ANCHOVIES("Spicy Fish");
private final String value;
Topping(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
注意:这是你提供的代码的中文翻译,不包括代码本身。
英文:
I think you are facing with difficulty to find the enums from given enum. Then you can use reflection to find them. Following you can find what I did.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
System.out.println(changeValue(Pet.DOG));
}
public static Enum changeValue(Enum<?> e) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
// Present user with list of e.values(), user can select new value
Method method = e.getClass().getDeclaredMethod("values");
Object obj = method.invoke(null);
System.out.println(Arrays.toString((Object[]) obj));
String newValue = getUserInput();
return e.valueOf(e.getClass(),newValue);
}
private static String getUserInput() throws IOException {
System.out.println("select one of the enum from list and enter the name");
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
String name = reader.readLine();
return name;
}
}
enum Pet {
DOG("Puppy"),
CAT("Jazmine"),
LIZARD("Spock");
private final String value;
Pet(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
enum Topping {
PEPPERONI("Meat Saucers"),
ONION("Like Ogres"),
ANCHOVIES("Spicy Fish");
private final String value;
Topping(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论