如何将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());
}
}
答案 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
仍然不是枚举,因此您无法启用它,无法使用EnumSet
和EnumMap
等。通常有更好的解决方案。< / p>