获取特定枚举的类型

时间:2014-01-08 09:57:13

标签: java enums

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

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内,我如何得到枚举类型?

3 个答案:

答案 0 :(得分:2)

每个枚举都是它自己的类型(在你的例子中,它们在这方面表现得像静态内部类)。

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

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){}
}

答案 1 :(得分:1)

EnumClass,Interface类似,因此根据我的理解,枚举的创建不能在课堂内。

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

答案 2 :(得分:1)

每个枚举都扩展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
    }   
}