【问题标题】:Inheritance in enum枚举中的继承
【发布时间】:2014-12-20 16:03:48
【问题描述】:

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

enum ABC{
   A,B,C;
 }

Class Test{

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

}

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

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

 enum xyz{
     X,Y,Z;
 }

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

  class Demo{

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

 }

我更新鲜了。请向我提供任何帮助或建议。我将不胜感激。

【问题讨论】:

  • 您不能扩展enums。但是,您可以使用方法doSomething() 创建接口MyInterface,然后使ABCXYZ 都实现MyInterface。这样你就可以在六个enum 常量中的任何一个上调用doSomething()

标签: java inheritance enums


【解决方案1】:

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;

 }

这样您就可以在doSomething() 中同时使用ABCDEF

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 了解如何解决枚举继承问题。

【讨论】:

    【解决方案2】:

    即使您提到了相同的名称,它在枚举中并不意味着相同。 例如ABC 中的示例 A 是 ABC 的实例。但是DEF 中的 A 是 DEF 的实例。所以它不同。您可以在枚举中实现接口。

    enum ABC implements X{
        A,B,C;
    }
    
    public class Test{
    
        public void doSomething(X x)
        {
    
        }
    }
    

    你会试试这个。

    【讨论】:

      【解决方案3】:

      您不能扩展枚举,但您可以通过模拟枚举的行为来做次佳的事情。您可以创建一个具有静态值的类。像这样。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多