如何使用枚举作为一个人将使用一个接口?

时间:2016-05-06 07:55:15

标签: java interface enums polymorphism

如何将SomeEnum1或SomeEnum2分配给实现SomeInterface的“enum”?我不能直接指定界面,因为它是一个类而不是枚举。

我确信有一个指定的语法糖来使这项工作,但我无法弄明白。

示例:

public class Main {
   public interface SomeInterface {
       public String doSomething();
   }

   public enum SomeEnum1 implements SomeInterface {
      something1;

      @Override
      public String doSomething() {
         return "SomeEnum1";
      }
   }

   public enum SomeEnum2 implements SomeInterface {
      something2;

      @Override
      public String doSomething() {
         return "SomeEnum2";
      }
   }

   public static void main(String[] args) {
      // Works but not polymorphic
      SomeEnum1 e1 = SomeEnum1.something1;
      System.out.println(e1.name() + " " + e1.doSomething());

      // Not an enum
      // SomeInterface e2 = SomeEnum1.something1;
      // System.out.println(e2.name() + " " + e2.doSomething());

      // Bounds mismatch
      // Enum<SomeInterface> e3 = SomeEnum1.something1;
      // System.out.println(e3.name() + " " + e3.doSomething());
   }
}

4 个答案:

答案 0 :(得分:2)

如果将值传递给方法,则可以使用泛型将SomeInterface的类型限制为2个约束:

public static void main(String[] args) {
    print(SomeEnum1.something1);
}

public static <T extends Enum & SomeInterface> void print(T t) {
    System.out.println(t.name() + " " + t.doSomething());
}

答案 1 :(得分:1)

你不能。
在Java中,枚举类型只能为该枚举类型定义值。

最接近你想要的东西实际上是你自己:

cacheBust

修改:为了能够使用SomeInterface e2 = SomeEnum1.something1; 方法,您需要将其添加到界面中,如下所示:

name()

由于该方法已在任何枚举上提供,因此您无需重新实施。

您是否有特定理由想要将其作为枚举?使用此方法,您可以获得public interface SomeInterface { public String doSomething(); public String name(); } 中定义的所有功能。我无法想象你为什么需要这里的枚举 - &gt;请详细说明我的答案是否与您的需求相近。

答案 2 :(得分:0)

您可以声明静态方法并为每个枚举值提供实现,而不是使枚举实现接口。

public enum Animal {

    DOG {
        public void makeNoise() { System.out.println("Bark bark!"); }
    },

    CAT {
        public void makeNoise() { System.out.println("Prrrrr!"); }
    };

    public abstract void makeNoise();

}

这样你可以像这样使用它:

Animal animal = Animal.DOG;
animal.makeNoise(); // prints "Bark bark!";

animal = Animal.CAT;
animal.makeNoise(); // prints "Prrrrr!"

答案 3 :(得分:0)

你可以这么简单:

SomeInterface e2 = SomeEnum1.something1;

问题是e2是一个接口,可以由任何类实现,也可以由没有name()方法的类实现。因此,如果要从SomeInterface - 类型引用访问该方法,则必须将其包含在界面中:

interface SomeInterface {
    String name();
}

但是,请注意SomeInterface仍然不是枚举,因此您无法启用它,无法使用EnumSetEnumMap等。通常有更好的解决方案。< / p>