Java 通用枚举作为参数

标签 java generics enums

所以我定义了几个如下所示的枚举。我有一个使用枚举来查找值的方法。

public enum MyEnum1
{
   STRING1("My String1"),
   STRING2("My String2"),
   STRING3("My String3"),
   STRINGLESS("String not found");

   private String s;

   private MyEnum1(String s) { this.s = s; }

   public String getValue() { return s; }
}

public enum MyEnum2
{
   STRING1("My String1"),
   STRING2("My String2"),
   STRING3("My String3"),
   STRINGLESS("String not found");

   private String s;

   private MyEnum2(String s) { this.s = s; }

   public String getValue() { return s; }
}

public class MyClass1
{
    public static String getPlacement(String myString)
    {
        for (MyEnum1 a: MyEnum1.values())
            if (myString.contains(a.toString()))
                return a.getValue();

        return MyEnum1.STRINGLESS.getValue();
     }
}

public class MyClass2
{
    public static String getPlacement(String myString)
    {
        for (MyEnum2 a: MyEnum2.values())
            if (myString.contains(a.toString()))
                return a.getValue();

        return MyEnum2.STRINGLESS.getValue();
     }
}

现在我定义了 5 个枚举,它们都由相同的 getPlacement 方法处理,但我必须创建 5 个不同的 MyClass 类(MyClass2、MyClass3...),并在 For 循环中硬编码为 MyEnum2、MyEnum3...让它发生。

我已经尝试过了...

public static String getPlacement(Enum e, String myString) {}

public static String getPlacement(Enum<?> e, String myString) {}

但两者都不起作用。

我想将一个枚举作为参数传递给 getPlacement 方法,这样我就可以只有一个 MyClass 类来处理 5 个不同的枚举。这可能吗?

最佳答案

要保留 getPlacement 的确切语义,您可以这样做:

interface StringValue {
    String getValue();
}

enum MyEnum1 implements StringValue {
    ...
    private String stringValue;
    ...

    @Override
    public String getValue() {
        return stringValue;
    }
}

static <E extends Enum<E> & StringValue>
String getPlacement(Class<E> enumClass, String inValue) {
    for(E constant : enumClass.getEnumConstants()) {
        if(inValue.contains(constant.toString()))
            return constant.getValue();
    }
    return Enum.valueOf(enumClass, "STRINGLESS").getValue();
}

我不确定这里的确切语义对您是否真的很重要。如果不是,还有更简单的方法。如果您不需要 contains 您可以使用 Enum#valueOf 。如果您可以覆盖 toString (因为您也可以使用 Enum#name ),那么您不需要接口(interface)。

而且,就像所有使用枚举的复杂情况一样,如果您不使用枚举,事情可能会简单得多。具有私有(private)构造函数和 public static final 常量的 final 类可以执行许多枚举无法执行的操作(例如从抽象父类(super class)型继承...)。

关于Java 通用枚举作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26979440/

相关文章:

c++ - 在 Objective C++ 代码中在 objc 整数和 C++ 枚举之间转换

Java泛型复制构造函数

c# - 无法从泛型方法返回 'null'?

java - 使用 Google 电子表格 api 时如何解决 "java.lang.NoSuchMethodError:"?

java - APT和AOP在同一个项目中,使用Maven

c# - 从通用列表底部删除重复项

delphi - 如何遍历任何给定集合中的枚举?

c - 带(有符号)枚举值的按位运算

java - 如何使用 Java 在 Azure 服务总线中创建队列?

Java加载资源Class.class.getResource vs <classname>.class.getResource