枚举中的继承

时间:2014-12-20 16:03:49

标签: java inheritance enums

我已经给了一个枚举ABC和一个类Test,我必须调用doSomething但是我不能将ABC枚举作为参数传递。

enum ABC{
   A,B,C;
 }

Class Test{

  public void doSomething(ABC abc)
  {
    //some work
   }

}

这里我想要一个enum DEF,它应该包含ABC的所有成员,它还应该包含enum XYZ的成员(我想要一个应包含两个枚举成员的枚举DEF(ABC和XYZ))。像这样的例子。

 enum DEF 
 {
    A,B,C,X,Y,Z,D;
 }

 enum xyz{
     X,Y,Z;
 }

这样我就可以调用doSomething方法,它只接受ABC枚举作为参数。我想用DEF.Example

调用doSomething()方法
  class Demo{

     public static void main(String[] ags)
     {
         Test test= new Test();
         test.doSomething(DEF.A);
      }

 }

我更新鲜。请向我提供任何帮助或建议。我将非常感谢你。

3 个答案:

答案 0 :(得分:9)

Java中的枚举是final,这意味着您无法扩展和枚举(您无法向现有枚举添加更多值)。在您的情况下,ABCDEF是完全不同的实体,具有与枚举项相同的简单名称。这意味着例如ABC.A != DEF.A

有很多方法可以解决这个问题,但是没有一种方法可以完美或简单。您应该评估您的具体案例所需的内容。

处理这种情况的第一种方法是创建一个公共接口,您的枚举可以扩展:

interface MyInterface{

}

enum ABC implements MyInterface{
   A,B,C;
 }

enum DEF implements MyInterface{ 
    A,B,C,X,Y,Z,D;

 }

这样您就可以在ABC中同时使用DEFdoSomething()

Class Test{

  public void doSomething(MyInterface abc)
  {
    //some work
   }

 }

其他方法是在您的班级中添加泛型。这样您就可以创建支持指定枚举的具体实现:

class GenericTest<E extends Enum<E>>{
    public void doSomething(E enum){
    }
}

class TestWhichAcceptsABC extends GenericTest<ABC>{}

class TestWhichAcceptsDEF extends GenericTest<DEF>{}

第三种方法是创建多个方法,每个方法对应一个需要处理的枚举

Class Test{

   public void doSomething(ABC abc)
   {
    //some work
   }

   public void doSomething(DEF abc)
   {
    //some work
   }

}

有关如何解决枚举继承的更多建议,请参阅This thread

答案 1 :(得分:1)

即使你在同名中提到它在枚举中也没有意思相同。  例如,ABC中的示例A是ABC的实例。但是DEF中的A是DEF的实例。所以它与众不同。您可以在枚举中实现接口。

enum ABC implements X{
    A,B,C;
}

public class Test{

    public void doSomething(X x)
    {

    }
}

你会试试这个。

答案 2 :(得分:-2)

您无法扩展枚举,但您可以通过模拟枚举的行为来完成下一个最好的事情。您可以创建具有静态值的类。像这样。

public class abc extends yxz {
    public static final int A = 1;
    public static final int B = 2;
    public static final int C = 3;
}