【问题标题】:Get type of specific enum获取特定枚举的类型
【发布时间】:2014-01-08 09:57:13
【问题描述】:

我有一个包含多个枚举的类,如下所示:

public class MyEnumerateClass
{
    public enum Enum1
    {
        enum1Value1,
        enum1Value2
    }

    public enum Enum2
    {
        enum2Value1,
        enum2Value2
    }
 }

我有一个方法可以像这样采用任何枚举:

 public void GetValue(MyEnumerateClass enumerateField)
 {
      switch (enumerateField)
      {
          case enum1Value1:
             ... do stuff here ...
             break;
      .......... stuff ..........
      }
  }

我们可以理解,GetValue 允许我接受之前声明的两个值中的任何一个。但我有一个问题:

当我需要检查枚举类型并检查它是Enum1还是Enum2时,我不知道如何处理......

 public void GetType(MyEnumerateClass enumerateField)
 {
        enumerateField.values(); // To do this I need to know the type of the enumerate
 }

那么,如果枚举类型在MyEnumerateClass 中,我该如何获取它?

【问题讨论】:

  • 这个问题对我来说真的没有意义。变量enumerateField 的类型是MyEnumerateClass,它只是一个类(尽管声明了一些枚举)。您不能打开一个类,此外,在 sn-p 中,您显示的对象甚至没有任何枚举类型的字段...

标签: java enums


【解决方案1】:

每个枚举都是它自己的类型(在您的示例中,它们在这方面的行为类似于静态内部类)。

要拥有一个允许两个枚举的方法参数,您必须构建类型层次结构或将 Object 作为参数值。如您所知,您可以接收哪些可能的类型(MyEnumerateClass $Enum1 或 MyEnumerateClass$Enum2),您可以使用 instanceof 检查并分支参数类型,或者重载两个枚举的方法。

void GetValue(Object o){
    if(o instanceof MyEnumerateClass.Enum1) {
        switch((MyEnumerateClass.Enum1) o){
        case enum1value1: ...
        }
    } else if (o instanceof MyEnumerateClass.Enum2) {
        switch((MyEnumerateClass.Enum2) o){
        case enum2value1: ...
        }
    }
}

class A {
    void GetValue(MyEnumerateClass.Enum1 value){}
    void GetValue(MyEnumerateClass.Enum2 value){}
}

【讨论】:

    【解决方案2】:

    Enum 类似于Class,Interface,因此根据我的理解,枚举的创建不能在类中。

    public enum Enum1
        {
            enum1Value1,
            enum1Value2
        }
        public enum Enum2
        {
            enum2Value1,
            enum2Value2
        }
    然后您可以创建一个对象并使用枚举值。您可以参考What's the use of "enum" in Java? 了解更多详情。

    【讨论】:

      【解决方案3】:

      每个枚举都扩展Enum<?>,因此您可以将参数限制为使用此类型的枚举实例。然后在方法内部使用instanceof

      public void GetValue(Enum<?> enumerateField) {
          if (enumerateField instanceof Enum1) {
              switch (enumerateField) {
                  case enum1Value1:
                    // ... do stuff here ...
                  break;
                   // .......... stuff ..........
              }
          } else (enumerateField instanceof Enum2) {
              // whatever
          }   
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多